下面是一个 Java 类构造函数,它接受错误处理的回调。
null
应该是可接受的值,如果传递的值是 null
则跳过错误处理。
我有两种方法来检查传递的回调是否能够被接受,我的问题是哪种方法(如果有的话)对于长期可维护性和理智来说是最好的。如果有人认为有更好的方法来解决这个问题,我也愿意接受建议,因为我对使用 Java 还比较陌生。
class ErrorMaker {
public ErrorMaker(Consumer<Throwable> onError) {
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
try (InputStream inputStream = classloader.getResourceAsStream("\\\\..\\..")) {
Properties config = new Properties();
config.load(inputStream);
// ...
} catch (Exception err) {
// METHOD #1 - null comparison
if (onError != null) {
onError.accept(err);
}
// METHOD #2 - instanceof
if (onError instanceof Consumer<?>) {
onError.accept(err);
}
}
}
}
提前致谢。
正如评论所解释的,您的两个解决方案在技术上都有效:
if (onError != null) {…}
if (onError instanceof Consumer<?>) {…}
在这两者中,第一个是更好的,因为它是显而易见的。
第二个似乎正在测试几种可能的亚型之一。但是您正在非常聪明地利用
instanceof
也可以作为非空测试的事实。恕我直言,这样聪明的代码是应该避免的,因为它未能通过最关键的测试:在凌晨 3 点整夜的紧急调试会话中,这段代码对于读者模糊的眼睛来说是否清晰可见?
就我个人而言,我会推荐第三种选择:
Objects
类、isNull
、nonNull
和requiresNonNull
上的便捷方法。英语单词(“nonNull”)通常比数学符号(“!=”)更容易阅读。
if ( Objects.nonNull( onError ) ) {…}