PropertyModel还是Serializable对象?

时间:2012-03-05 15:36:38

标签: wicket wicket-1.5

哪种方法更好?:

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

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

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

2 个答案:

答案 0 :(得分:5)

这个版本比你给出的两个选项中的更好:

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

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

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

对于使用PropertyModel的危险,有一些事情要说。这是“字符串”编程。您的编译器无法帮助您验证属性名称“name”的正确性。如果您稍后重构代码并将属性的名称更改为“firstName”,则您必须手动查找引用旧属性名称的所有位置并手动更改它们。

答案 1 :(得分:5)

它们在功能上有所不同。

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

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

如果您希望它保持不变,即使基础对象发生变化,您也无法使用PropertyModel

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

  1. 它破坏了封装:在没有getter的情况下,它将尝试访问私有字段本身。
  2. 正如@Jesse所指出的那样,它是“神奇的”。如果您重构课程并重命名字段,则PropertyModel将会中断。
  3. 阅读或维护并不容易。当然,它并没有那么难,但为什么当你没有从中得到任何东西时增加任何不必要的复杂性?如果您将cat.getName()放在那里,您可以在IDE中“点击”,您的标签将显示在搜索getName()方法的所有调用中,依此类推。
  4. 如果你有很多组件引用同一个对象的字段,你可以考虑使用CompoundPropertyModel,虽然它仍然遇到问题1和2,但是让你的代码看起来更清晰。

    如果您有三个或更少的组件,但您不需要动态模型,请使用无模型格式。