Java - 使用空比较还是instanceof?

问题描述 投票:0回答:1

下面是一个 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);
            }

        }
    }
}

提前致谢。

java error-handling callback
1个回答
0
投票

正如评论所解释的,您的两个解决方案在技术上都有效:

  • if (onError != null) {…}
  • if (onError instanceof Consumer<?>) {…}

在这两者中,第一个是更好的,因为它是显而易见的。

第二个似乎正在测试几种可能的亚型之一。但是您正在非常聪明地利用

instanceof
也可以作为非空测试的事实。恕我直言,这样聪明的代码是应该避免的,因为它未能通过最关键的测试:在凌晨 3 点整夜的紧急调试会话中,这段代码对于读者模糊的眼睛来说是否清晰可见?

就我个人而言,我会推荐第三种选择:

Objects
类、
isNull
nonNull
requiresNonNull
上的便捷方法。英语单词(“nonNull”)通常比数学符号(“!=”)更容易阅读。

if ( Objects.nonNull( onError ) ) {…}
© www.soinside.com 2019 - 2024. All rights reserved.