为什么使用 "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)。
当我学习番石榴时,我在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)。