我正在阅读关于重构的福勒书。在更改接口部分的第2章中。我不明白这段经文:
在更改接口时,有一个特定区域存在问题 Java:在throws子句中添加一个异常。这不是改变 在签名中,所以你不能使用委托来掩盖它。编译器 但是,不会让它编译。处理这个很难 问题。您可以为方法选择一个新名称,让旧方法 调用它,并将checked转换为未经检查的异常。您可以 也抛出一个未经检查的异常,虽然你失去了检查 能力。执行此操作时,您可以提醒您的呼叫者 异常将在未来日期成为检查异常。然后他们 有时间将处理程序放入代码中。出于这个原因我 更喜欢为整个包定义超类异常(例如 java.sql的SQLException)并确保公共方法只声明 他们的throws子句中的这个异常。那样我就可以定义子类了 如果我愿意,可以例外,但这不会影响只知道的呼叫者 关于一般情况。
有人可以用一个例子解释一下吗?万分感谢!
答案 0 :(得分:2)
假设您目前有:
public interface Foo {
void bar();
}
您无法在以后将其演变为:
public interface Foo {
void bar() throws SomeException;
}
(其中SomeException
是一个已检查的异常),因为之前调用bar()
的代码不会捕获SomeException
...它将在更改后无法编译。建议的解决方法是引入一种新方法:
public interface Foo {
void bar();
var barWithException() throws SomeException;
}
...虽然Foo
的任何实施都会失效,因为他们不会声明barWithException()
。
建议的另一个替代方法是使SomeException
成为未经检查的异常,并警告用户以后可能会对其进行检查。