0

哪种方法更好?:

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

或者

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

我试图找到有关比较的任何信息..但找不到任何东西我如何理解第一种方法是读/写逻辑,第二种方法是只读逻辑(如果我不正确,请写信给我)。但是对于只读逻辑,哪个更好?

4

2 回答 2

5

此版本是您提供的两个选项中更好的一个:

添加(新标签(“标签”,新PropertyModel(猫,“名称”)));

如果稍后在猫的名称更改后重新绘制页面,它允许在页面上呈现的值更新。

第二个选项只会显示猫的名字,就像它在Label创建时一样。如果猫的名字改变,它永远不会改变。

对于使用的危险,有话要说PropertyModel。这是“字符串”编程。您的编译器没有帮助您验证属性名称“name”的正确性。如果您稍后重构代码并将属性名称更改为“firstName”之类的名称,那么您将不得不手动查找引用旧属性名称的所有位置并手动更改它们。

于 2012-03-05T15:41:43.243 回答
5

它们在功能上是不同的。

第一个说:每当重新渲染此组件时,刷新值。第二个说:显示创建时的值。

你需要哪一个?如果你想要一个动态刷新的标签,你别无选择,它是PropertyModelCompoundPropertyModel(见后文)。

如果你想让它保持不变,即使底层对象发生变化,你也不能使用PropertyModels.

但是,如果您绝对确定它cat.getName()永远不会改变,因此两个版本的行为方式相同,我个人不会使用PropertyModel以下三个原因:

  1. 它打破了封装:在没有 getter 的情况下,它将尝试访问私有字段本身。
  2. 正如@Jesse 指出的那样,它是“魔法”。如果你重构你的类并重命名你的字段,你PropertyModel会崩溃。
  3. 它并不容易阅读或维护。当然,这也没有那么难,但是当你没有从中得到任何东西时,为什么还要添加任何不必要的复杂性呢?如果你放在cat.getName()那里,你可以在你的IDE中“点击”,你的标签将显示在搜索getName()方法的所有调用等等。

如果你有许多组件引用同一个对象的字段,你可以考虑使用CompoundPropertyModels,虽然仍然存在问题 1 和 2,但让你的代码看起来更干净。

如果您有三个或更少这样的组件并且您不需要动态模型,则只需使用无模型格式。

于 2012-03-05T20:15:14.293 回答