我被问到这个问题,坦率地说,我被难倒了:

而不是编写抽象方法,我们可以尝试用例外来伪造它们,如下所示:

public int someMethod(int someparameter) {
    throws new RuntimeException("unimplemented");
}

这样做的目的是什么,任何人都可以为上面试图伪造的抽象方法提供代码示例吗?任何帮助,非常感谢。谢谢!.

有帮助吗?

解决方案

我可以想到一个(可能)有效的用例:您有一个抽象类,以及整个项目中扩展它的许多其他类。(或者抽象类在开源库中,所以你不知道整个宇宙中的其他类可能会从它扩展。)现在,您发现向此类添加新的抽象方法很有用。但如果你加上 abstract 类的方法,这会破坏已经扩展它的所有其他类,因为需要更改这些类以包含新方法的复盖。所以我可以看到,在某些情况下,将它们添加为非抽象方法并让它们抛出异常以防万一可能被认为更可行 新的 扩展它的类使用新方法,但忘记编写重写方法。它不会在编译时被捕获,但至少在测试期间可能会被捕获。

我不确定这个原因有多合理,因为也可以定义一个新的抽象类 NewImprovedWhatever 这扩展了旧的方法,以包含新的方法。不过,这可能会带来自身的维护挑战。我不确定。

我确实注意到Java定义了一个抽象类 java.net.SocketImpl, ,即包含两个非抽象方法, shutdownInput()shutdownOutput(), ,其默认实现是抛出异常:

protected void shutdownInput() throws IOException {
  throw new IOException("Method not implemented!");
}

评论表明它们是在1.3中添加的,所以也许这就是它以这种方式完成的确切原因,即不要求修改已经扩展的其他类 SocketImpl.但我不确定。

无论如何,像这样的设计肯定是很糟糕的代码,如果类是从头开始设计的。但是,当必须修改现有代码时,我们在课堂上学到的好的O-O概念在实践中并不总是那么好。

其他提示

我有时抛出 unsupportedoperationException 来自尚未实施其功能的方法。(还有一个NotimplementedException在Apache Commons 中是一个UnsupportedoperationException的子类。)这始终是使用该方法尚未完成的相关类或服务的占位符和向其他人的消息。然而,这样的代码从未使其生产。

这样做的目的是故意写出坏代码
如果一个人想要混淆读者并希望他们感受到通过他们的代码的痛苦,那么就是写这样的代码。
它还显示了代码中缺乏设计技巧。
写作不好的API将有这样的代码。
不要这样做。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top