Кажется, что вы неправильно читаете текст.
Теперь я могу согласиться с последним, но в JavaBeans моего глаза в списке делает много больше смысла, чем вложенные Maps
Текст никогда не упоминает вложенные карт в качестве альтернативы (yiack)
... следует назвать конструкторами, не установлен * методы и объект должен быть неизменен
Это хорошая практика, особенно полезная при работе с потоками.
Но мы не можем сказать, что с помощью сеттеров является baaad либо, особенно, когда один поток с помощью объекта. Это совершенно безопасно.
Я не хочу создавать новый объект каждый раз, когда предоставляется новая информация, я хочу добавить его в существующий.
Это нормально, до тех пор, как вы контролируете объект не существует никаких проблем с этим, некоторые другие могут найти проще просто создать новый объект.
Является ли использование JavaBeans для хранения данных плохой практикой и его следует избегать или это абсолютно безопасно?
Нет, это не плохая практика. Не является совершенно безопасным либо. Зависит от ситуации.
Проблема с изменяемыми объектами (не с JavaBeans как таковой) использует разные потоки для доступа к ним.
Вы должны синхронизировать доступ, чтобы избежать того, чтобы один поток изменял объект, а другой - к нему.
Неизменяемые объекты не имеют этой проблемы, потому что ... ну, они не могут измениться, и, следовательно, вам не нужно ничего синхронизировать.
Чтобы убедиться, что объект неизменен, вы должны объявить свои атрибуты окончательными.
class MyBean {
private final int i;
}
Если вы хотите присвоить разумное значение для MyBean.i
вы должны указать его в конструкторе:
public MyBean(int i) {
this.i = i;
}
Поскольку переменная является окончательным, вы не можете использовать сеттер. Вы можете просто предоставить геттер.
Это совершенно потокобезопасно, и лучше всего, вам не нужно синхронизировать доступ, потому что если два потока попытаются получить значение i
, они оба всегда будут видеть значение, которое было присвоено при создании, вы не нужно ничего синхронизировать.
Неплохая практика или хорошая практика.Мы должны работать с одним потоком, даже в многопоточных средах, таких как сервлеты.
Если в будущем вам приходится иметь дело с несколькими приложениями резьбы, вы можете рассмотреть возможность использования непреложного JavaBean;)
Кстати, альтернатива для создания неизменных бобов, и по-прежнему обеспечивает кучу сеттеров используют Builders
как :
Employee e = new EmployeeBuilder()
.setName("Oscar")
.setLastName("Reyes")
.setAge(0x1F)
.setEmployeeId("123forme")
.build();
который выглядит очень похож на регулярную setXyz, используемой в обычной фасоли с выгодой используя неизменные данные.
Если вам нужно изменить одно значение, вы можете использовать метод класса:
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 Я настоятельно рекомендую вам купить эту книгу: Effective Java. Вы никогда не пожалеете об этом, и у вас будет информация, чтобы судить о лучших статьях, как цитируется.
JavaBeans не столько представляет собой шаблон в целом, как анти-шаблонный язык. –
вы можете использовать построитель, чтобы получить преимущества неизменности и избежать супер длинного конструктора. –
Рассмотрите возможность изучения шаблона Builder. http://en.wikipedia.org/wiki/Builder_pattern. – CoolBeans