使用Java中的异常伪造抽象方法

时间:2014-02-27 18:26:23

标签: java exception abstract-methods

我被问到这个问题,坦白地说:

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

这样做的目的是有目的地写出 BAD CODE 如果有人想让读者感到困惑并希望他们感受到通过他们的代码的痛苦,那么就会编写这样的代码 它还表明代码中缺乏设计技巧 写得不好的API会有这样的代码 不要那样做。