java - 使用空检查还是更喜欢空方法?

标签 java performance coding-style

<分区>

场景

我想提供一种可能性,以可选在我的工作类中添加回调。这种回调的接口(interface)可能看起来像这样:

public interface Callback<T> {

    void callback(final T data);

}

因为回调是可选的,所以每次调用之前我都需要检查是否在工作类中设置了回调:

public void doWork(final T data) {
    if (callback != null) {
        callback.callback(data);
    }

    // do the actual work
}

想法

所以我想知道有一个无操作回调是不是一个好主意,它看起来像这样:

@SuppressWarnings("rawtypes")
public class NopCallback implements Callback {

    public static final NopCallback CALLBACK = new NopCallback();

    @Override
    public void callback(final Object data) {
        // do nothing
    }

}

默认情况下,worker 会将其回调设置为此 NopCallback:

@SuppressWarnings("unchecked")
public Worker() {
    callback = NopCallback.CALLBACK;
}

真题

我已经发现 Nop 变体似乎表现更好(通过调用 doWork(...) 几千次并测量每个变体的持续时间)。我不太满意的是 @SuppressWarnings 的需要。我知道我可以摆脱它们,但我需要在我的每个工作类中有一个自己的 NopCallback 实例。

长话短说,从干净的代码可读性性能等方面来说,使用这种无操作回调是个好主意吗. 或者还有其他(优雅的)替代方案吗?

最佳答案

这对我来说看起来很优雅。它基本上与 Collections.emptyList() 相同,它总是返回相同的、空的、不可变的列表。虽然我不会将它设为公共(public)类,但会使用工厂方法来获取它,以确保警告仅出现在一个地方,并且其余代码是类型安全的:

@SuppressWarnings("unchecked")
private static final Callback NOP = new Callback() {
    @Override
    public void callback(final Object data) {
        // do nothing
    }
};

@SuppressWarnings("unchecked")
public static final <T> Callback<T> nop() {
    return (Callback<T>) NOP;
}

这就是 Collections.emptyList() 的实现方式。

关于java - 使用空检查还是更喜欢空方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20443948/

相关文章:

java - 如何使用 mvn -D 通过命令行在 Maven 中设置(多个)属性?

javascript - 如何在 Beanshell PostProcessor 中打印 JDBC 请求和响应 header

c# - 在 .NET 上更快地解析数字

ruby - 使用 Ruby Sequel 清理关联定义

java - 具有一台数据库服务器的局域网中的分布式应用程序

java - 生成序列 NexVal 而不执行选择查询

Java 读取文件/扫描仪

node.js - 为在 node.js 应用程序上运行的 mongodb 计算 n 个连接池所需的内存

Java 最佳实践 - 在类变量之前声明构造函数是一件坏事吗?

Python __init__.py 与 sys.path.append/insert