Wicket PropertyModel还是可序列化对象?

Wicket PropertyModel还是可序列化对象?,wicket,wicket-1.5,Wicket,Wicket 1.5,哪种方法更好 add(new Label("label", new PropertyModel<String>(cat, "name"))); 我试图找到任何有关比较的信息。。但是什么也找不到 我如何理解第一种方法适用于读/写逻辑,第二种方法适用于只读逻辑(如果我不正确,请写信给我)。但是对于只读逻辑,哪一个更好?此版本是您提供的两个选项中更好的: add(new Label("label", new PropertyModel(cat, "name"))); 添加(新标签(“标签

哪种方法更好

add(new Label("label", new PropertyModel<String>(cat, "name")));
我试图找到任何有关比较的信息。。但是什么也找不到
我如何理解第一种方法适用于读/写逻辑,第二种方法适用于只读逻辑(如果我不正确,请写信给我)。但是对于只读逻辑,哪一个更好?

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

add(new Label("label", new PropertyModel(cat, "name"))); 添加(新标签(“标签”,新PropertyModel(类别,“名称”)); 如果在更改cat名称后重新绘制页面,则允许更新页面上呈现的值

第二个选项将仅显示创建
标签时的猫名。如果猫的名字变了,它就永远不会变


使用
PropertyModel
的危险性值得一提。这是“字符串”编程。编译器没有帮助您验证属性名“name”的正确性。如果以后重构代码并将属性名称更改为类似“firstName”的名称,则必须手动查找引用旧属性名称的所有位置并手动更改它们。

它们在功能上不同

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

你需要哪一个?如果您想要动态刷新标签,则别无选择,它是
PropertyModel
CompoundPropertyModel
(见下文)

如果希望它保持不变,即使基础对象发生了更改,也不能使用
PropertyModel
s

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

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

    如果有很多组件引用同一对象的字段,则可以考虑使用<代码> CopyPrimeType模型< /Cult> S,尽管仍然存在1和2的问题,但使代码看起来更干净。


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

    第二个变体必须是work。构造函数在此字符串上创建模型:(public Label(final String id,String Label){this(id,new model(Label));}它只将标签包装到模型中;模型稍后无法更新此值,因为它不知道有关cat对象的任何信息。 add(new Label("label", new PropertyModel(cat, "name")));