我可以将我的方法 readConfig() 放入构造函数中吗?
在构造函数中调用不可覆盖的方法是一种可接受的方法。
如果该方法仅由构造函数使用,您可能想知道是否真的需要将其提取到方法中(甚至private)。
如果您选择将构造函数完成的某些逻辑提取到方法中,那么对于任何方法,您都必须选择适合方法要求的访问修饰符,但在这种特定情况下,更重要的是 保护方法必须冒着使超类构造函数不一致的风险来反对方法的覆盖。
所以它应该是private,如果它只被类的构造函数(和实例方法)使用。
否则,如果在包内或子类中重用该方法,则它应该是 package-private 和 final。
这会给我一次打电话的好处,还是有另一种机制可以做到这一点?
使用这种方式没有任何好处或缺点。
我不鼓励在构造函数中执行太多逻辑,但在某些情况下,在构造函数中初始化多个事物可能是有意义的。
例如,复制构造函数可能会执行很多事情。
多个 JDK 类说明了这一点。
以HashMap 复制构造函数为例,它构造一个新的HashMap,其映射与指定的Map 参数相同:
public HashMap(Map<? extends K, ? extends V> m) {
this.loadFactor = DEFAULT_LOAD_FACTOR;
putMapEntries(m, false);
}
final void putMapEntries(Map<? extends K, ? extends V> m, boolean evict) {
int s = m.size();
if (s > 0) {
if (table == null) { // pre-size
float ft = ((float)s / loadFactor) + 1.0F;
int t = ((ft < (float)MAXIMUM_CAPACITY) ?
(int)ft : MAXIMUM_CAPACITY);
if (t > threshold)
threshold = tableSizeFor(t);
}
else if (s > threshold)
resize();
for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) {
K key = e.getKey();
V value = e.getValue();
putVal(hash(key), key, value, false, evict);
}
}
}
提取putMapEntries() 中填充的地图逻辑是一件好事,因为它允许:
- 在其他上下文中重用该方法。例如
clone() 和putAll() 也使用它
- (次要但有趣)给出一个有意义的名称来传达执行的逻辑