Прежде всего, все неконечные переменные экземпляра должны быть объявлены private , если вы хотите сохранить контроль!
Рассмотрим также ленивую реализацию - это также позволяет избежать «плохого состояния», но инициализируется только при использовании:
class Foo {
private List<X> stuff;
public void add(X x) {
if (stuff == null)
stuff = new ArrayList<X>();
stuff.add(x);
}
public List<X> getStuff() {
if (stuff == null)
return Collections.emptyList();
return Collections.unmodifiableList(stuff);
}
}
(обратите внимание на использование Collections.unmodifiableList - если вы действительно не хотите, чтобы вызывающий абонент мог добавлять / удалять из вашего списка, вы должны сделать его неизменным)
Подумайте, сколько экземпляров рассматриваемого объекта будет создано. Если их много, и вы всегда создаете списки (и в конечном итоге можете получить много пустых списков), вы можете создавать гораздо больше объектов, чем вам нужно.
Кроме этого, это действительно вопрос вкуса, и если вы можете иметь значимые ценности при создании.
Если вы работаете с DI / IOC, вы хотите, чтобы фреймворк выполнил эту работу за вас (хотя вы могли бы сделать это с помощью инжектора конструктора; я предпочитаю сеттеры)
- Скотт