为什么使用 "inner Class" 而不是直接使用 "new"?

Why use "inner Class" instead of using "new" directly?

当我学习番石榴时,我在com.google.common.hash.Hashing class:

中找到了这样的代码
public static HashFunction crc32c() {
    return Crc32cHolder.CRC_32_C;
}

private static final class Crc32cHolder {
    static final HashFunction CRC_32_C = new Crc32cHashFunction();
}

我想知道,为什么不这样写,难道这只是作者的习惯吗?还是其他目的?

public static HashFunction crc32c() {
    return new Crc32cHashFunction()
}

您的替代建议

public static HashFunction crc32c() {
    return new Crc32cHashFunction()
}
每次调用 crc32c() 时,

都会创建一个新的 Crc32cHashFunction 实例。如果没有特定需要在每次调用中 return 编辑新实例,则在每次调用中 return 相同实例会更有效。

使用静态最终变量

static final HashFunction CRC_32_C = new Crc32cHashFunction();

是实现单实例的一种方式。

至于为什么 HashFunction 实例是嵌套 class Crc32cHolder 的成员(而不是外部 class 的成员),动机可能是惰性评估——只有在第一次调用 crc32c() 方法时,才会初始化 Crc32cHolder class 并创建 Crc32cHashFunction 实例。因此,如果从未调用该方法,则永远不会创建 Crc32cHashFunction(假设没有其他访问 Crc32cHolder class)。