2012-03-05 2 views
0

Какой метод лучше ?:Свойство PropertyModel или Serializable?

add(new Label("label", new PropertyModel<String>(cat, "name"))); 

или

add(new Label("label", cat.getName())); 

Я пытался найти какую-либо информацию о сравнении .. но не мог найти ничего Как я понимаю, первый метод для чтения/писать логику и вторую для чтения только логику (если я не прав, напишите мне). Но для чтения только логика, которая лучше?

ответ

5

Они функционально разные.

Первый говорит: всякий раз, когда этот компонент повторно отображается, обновите значение. Второй говорит: отображает значение, как это было во время создания.

Какой из них вам нужен? Если вы хотите динамически обновляемую этикетку, у вас нет выбора, это PropertyModel или CompoundPropertyModel (см. Ниже).

Если вы хотите, чтобы он остался прежним, даже если базовый объект изменился, вы не можете использовать PropertyModel s.

Однако, если вы абсолютно уверены в том, что cat.getName() никогда не изменится, и, следовательно, обе версии ведут себя так же, лично я бы не использовать PropertyModel по трем причинам:

  1. Он ломает инкапсуляцию: в отсутствие геттера он попытается получить доступ к самому частному полю.
  2. Как @Jesse указал на это, это «волшебство». Если вы реорганизуете свой класс и переименуете свои поля, ваш PropertyModel сломается.
  3. Непросто читать или обслуживать. Конечно, это не намного сложнее, но зачем добавлять ненужную сложность, когда вы ничего не получаете от этого? Если вы разместите cat.getName(), вы можете «щелкнуть» в своей среде IDE, ваш ярлык появится в поиске всех вызовов метода getName() и т. Д.

Если у вас есть много компонентов, относящихся к полям одного и того же объекта, вы можете рассмотреть возможность использования CompoundPropertyModel с, что, хотя по-прежнему страдают от проблем 1 и 2, сделать ваш код выглядеть намного ровнее.

Если у вас есть три или менее таких компонентов, хотя вам и не нужна динамическая модель, просто используйте формат без модуляции.

5

Эта версия является лучшим из двух вариантов вы дали:

 
add(new Label("label", new PropertyModel(cat, "name"))); 

Это позволяет значение оказывается на странице, чтобы обновить, если страница перекрасили позже после того, как имя кошки изменилось.

Второй вариант отображает только имя кошки, как это было в то время, когда был создан Label. Он не изменится, если имя кошки изменится.

Есть что сказать об опасностях использования PropertyModel. Это «струнные» программы. Вы не помогаете вам проверить правильность имени свойства «имя». Если позднее вы реорганизуете свой код и измените имя свойства на нечто вроде «firstName», вам придется вручную найти все места, где вы ссылаетесь на старое имя свойства и вручную их изменить.

+0

Второй вариант - работа. Конструктор создать модель на этой строке :( общественного Ярлык (окончательный идентификатор строки, String ярлык) { \t это (идентификатор, новая модель (ярлык));} – pushistic

+1

Это только оборачивает этикетку в модель, а модель не может обновить это значение позже, потому что ничего не знает о cat-объекте. – rotsch

Смежные вопросы