1

我被问到这个问题,坦率地说,我很难过:

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

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

这样做的目的是什么,任何人都可以提供上面试图伪造的抽象方法的代码示例吗?任何帮助是极大的赞赏。谢谢你。

4

3 回答 3

2

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

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

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

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

注释表明它们是在 1.3 中添加的,所以也许这就是这样做的确切原因,即不需要修改已经扩展的其他类SocketImpl。但我不确定。

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

于 2014-02-27T18:50:22.400 回答
1

我有时会从功能尚未实现的方法中抛出UnsupportedOperationException 。(Apache Commons 中还有一个NotImplementedException,它是 UnsupportedOperationException 的子类。)这始终是作为占位符和向使用相关类或服务的其他人发送该方法尚未完成的消息。然而,这样的代码从未投入生产。

于 2014-02-27T18:40:15.803 回答
0

这样做的目的是有目的地编写BAD CODE
如果一个人想迷惑它的读者并想让他们感受到阅读他们的代码的痛苦,那么就可以编写这样的代码。
这也表明代码中缺乏设计技能。
写得不好的 API 会有这样的代码。
不要那样做。

于 2014-02-27T18:31:42.780 回答