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")));