我可以将方法readConfig()放入构造函数吗?
在构造函数中调用不可替代的方法是可以接受的方法。
如果该方法仅由构造方法使用,则您可能想知道是否确实需要将其提取到方法中(甚至putMapEntries())。
如果您选择将构造函数完成的某些逻辑提取到方法中,那么对于任何方法,您都必须选择适合该方法要求的访问修饰符,但在这种特定情况下,它对于防止该方法被覆盖是至关重要的。 必须冒使超类构造函数不一致的风险。
因此,如果仅由该类的构造函数(和实例方法)使用它,则应该为putMapEntries()。
否则,如果在包内或子类中重用此方法,则应同时为HashMap和Map。
这将给我一次打电话的好处,还是有另一种机制可以做到这一点?
使用这种方式没有任何好处或缺点。
我不鼓励在构造函数中执行很多逻辑,但是在某些情况下,在构造函数中初始化多件事可能很有意义。
例如,复制构造函数可能执行许多操作。
多个JDK类对此进行了说明。
以putMapEntries()复制构造函数为例,该构造函数构造一个新的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()也使用它
(小但有趣)给出一个有意义的名称,以传达所执行的逻辑