PropertyModel или Сериализуемый объект? - PullRequest
0 голосов
/ 05 марта 2012

Какой метод лучше?:

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

или

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

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

Ответы [ 2 ]

5 голосов
/ 06 марта 2012

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

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

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

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

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

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

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

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

5 голосов
/ 05 марта 2012

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

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

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

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

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

...