2012-03-15 33 views
1

我刚刚尝试了GWT's editor framework并得到了一个小例子。但我想知道为什么子编辑需要封装私有?为什么GWT编辑器框架中的子编辑器需要是包私有的?

在链接页面的示例中有一条评论特别提到了包保护字段,但我找不到原因。

// Sub-editors are retrieved from package-protected fields, usually initialized with UiBinder. 
// Many Editors have no interesting logic in them 
public class PersonEditor extends Dialog implements Editor<Person> { 
    Label nameEditor; 
    AddressEditor addressEditor; 
    ... 
} 

在我尝试自己的例子,我只得到它,如果我的子编辑都是包私有的,如果我让他们私人工作,结合确实不再起作用。

任何人都可以向我解释为什么这个限制存在吗?这让我的编码风格显得有些不一致。谢谢!

回答

6

类似于UiBinder,EditorDriver的生成器会生成沿类Editor类的类。这些类需要访问编辑者才能使用它们。

换句话说,编辑框架不会修改你的类(没有魔法),所以你必须以某种方式暴露你的子编辑:包私人就够了,但public当然会工作过。
了解发生什么的最好方法是将-gen选项(后跟目录路径)传递给开发模式的GWT编译器,以便将所有生成的类输出到磁盘。但请注意:编辑框架很难理解!另外,如果您的编辑器在另一个包含子编辑器(您想要继承的)的包中扩展某个其他类,则该子编辑器必须在子类的包中可见,因此它必须是public,并且必须是public父类,或者由子类明确公开(使用不是private的访问器方法)。

+0

感谢您的解释:) – ftr 2012-03-16 07:50:54

2

GWT为驱动程序使用的每个编辑器生成编辑器委托(和上下文)。这个委托(和上下文)需要访问他们将要操作的子编辑器,作为将数据传入和传出编辑器的一部分。由于这些是用Java编写的,而不是使用JSNI访问专用字段,所以编辑器必须可以访问同一包中的其他类。

这就是说,有几种选择给你。首先是明确地将它们设置为publicprotected,这可能会或可能不适合您的代码风格。第二种方法是通过方法暴露它们,命名方法与要编辑的属性相同,可以后缀“编辑器”。有关详细信息,请参阅http://code.google.com/webtoolkit/doc/latest/DevGuideUiEditors.html#Editor_contract

此限制与uibinder限制相同 - 该字段必须可以从生成的类读取/写入。如果你只有一个private Label nameEditor;,那么你的IDE可能会抱怨你没有使用它,因为它看不到没有生成可以访问这些字段的代码。使其比private更公开明确表示它将在该单一课程之外使用。

+0

感谢科林,我希望我可以接受多个答案。堆栈溢出真的很棒,在问这个问题之前,我刚刚在Senchacon 2011上看到了关于数据绑定和编辑的演讲视频,其中还简要介绍了Thomas Broyer关于MVP的内容。 – ftr 2012-03-16 08:03:41

+0

他的回答非常好 - 我开始了我的工作,并考虑过不要发布它,但我认为它为讨论添加了一些内容,对下一位读者可能是值得的。希望视频很有帮助! – 2012-03-16 14:01:33