PropertyModel还是Serializable对象?

pus*_*tic 0 wicket wicket-1.5

哪种方法更好?:

add(new Label("label", new PropertyModel<String>(cat, "name")));
Run Code Online (Sandbox Code Playgroud)

要么

add(new Label("label", cat.getName()));
Run Code Online (Sandbox Code Playgroud)

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

Jes*_*sse 5

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

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

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

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

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


biz*_*lop 5

它们在功能上是不同的.

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

你需要哪一个?如果你想要一个动态刷新的标签,你别无选择,PropertyModel或者CompoundPropertyModel(见下文).

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

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

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

如果你有许多组件引用同一个对象的字段,你可以考虑使用CompoundPropertyModels,虽然仍然遇到问题1和2,但是让你的代码看起来更清晰.

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