Кажется, вы неправильно читаете текст.
Теперь я могу согласиться с последним, но на мой взгляд JavaBeans в списке имеет гораздо больше смысла, чем вложенные Карты
Текст никогда не упоминает вложенные карты как альтернативу (yiack)
... должен вызывать конструкторы, а не набор * методов, и объект должен быть неизменным
Это хорошая практика, особенно полезная при работе с потоками.
Но мы не можем сказать, что использование сеттеров - это тоже baaad , особенно, когда объект используется одним потоком. Это совершенно безопасно.
Я не хочу создавать новый объект каждый раз, когда дается новая информация, я хочу добавить его к существующему.
Это нормально, пока вы управляете объектом, с этим нет проблем, другим может оказаться проще просто создать новый объект.
Является ли использование JavaBeans для хранения данных плохой практикой и его следует избегать, или это совершенно безопасно?
Нет, это не плохая практика. Не совершенно безопасно тоже. Зависит от ситуации.
Проблема с изменяемыми объектами (а не с JavaBeans как таковыми) заключается в использовании различных потоков для доступа к ним.
Вы должны синхронизировать доступ, чтобы один поток не изменял объект, пока другой обращается к нему.
Неизменяемые объекты не имеют этой проблемы, потому что ... ну, они не могут измениться, и, следовательно, вам не нужно ничего синхронизировать.
Чтобы убедиться, что объект неизменен, вы должны объявить свои атрибуты как окончательные.
class MyBean {
private final int i;
}
Если вы хотите присвоить разумное значение MyBean.i
, вы должны указать его в конструкторе:
public MyBean( int i ) {
this.i = i;
}
Поскольку переменная является конечной, вы не можете использовать установщик. Вы можете просто предоставить геттер.
Это совершенно поточно-ориентированный, и самое главное, вам не нужно синхронизировать доступ, потому что, если два потока попытаются получить значение i
, они оба всегда увидят значение, назначенное при создании экземпляра, Вам не нужно ничего синхронизировать.
Не плохая практика или хорошая практика. Мы должны работать с одним потоком, даже в многопоточных средах, таких как сервлеты.
Если в будущем вам придется иметь дело с многопоточными приложениями, вы можете рассмотреть возможность использования неизменного JavaBean;)
Кстати, альтернатива для создания неизменяемых bean-компонентов и все еще предоставления набора сеттеров использует Builders
, например:
Employee e = new EmployeeBuilder()
.setName("Oscar")
.setLastName("Reyes")
.setAge(0x1F)
.setEmployeeId("123forme")
.build();
Что выглядит довольно похоже на обычный setXyz, используемый в обычных bean-компонентах, с преимуществом использования неизменяемых данных.
Если вам нужно изменить одно значение, вы можете использовать метод класса:
Employee e = Employee.withName( e, "Mr. Oscar");
, который берет существующий объект, копирует все значения и устанавливает новый ....
public static EmployeeWithName( Employee e , String newName ){
return new Employee( newName, e.lastName, e.age, e.employeeId );
}
Но опять же, в однопоточной модели совершенно безопасно использовать геттеры / сеттеры.
PS Я настоятельно рекомендую вам купить эту книгу: Эффективная Java . Вы никогда не пожалеете об этом, и у вас будет информация, чтобы судить о лучших статьях, подобных цитируемой.