Могу ли я поместить свой метод 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()
используйте это тоже
- (незначительное, но интересное), дающее осмысленное имя, которое передает выполненную логику