我刚刚尝试了GWT's editor framework并将其用于一个小例子。但我想知道为什么副编辑需要打包私有?
链接页面中的示例中有一条注释专门提到了受包保护的字段,但我找不到原因。
// 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;
...
}
在我自己尝试的示例中,如果我的子编辑器是包私有的,我只能使用它,如果我将它们设为私有,则绑定不再有效。
有人能解释为什么存在这种限制吗?它使我的编码风格看起来有点不一致。谢谢!
答案 0 :(得分:6)
与UiBinder类似,EditorDriver
的生成器会生成类Editor
类。这些类需要访问编辑器才能使用它们。
换句话说,编辑器框架不会修改你的类(没有魔法),所以你必须以某种方式暴露你的子编辑:package-private就足够了,但是{{1}当然也会工作。
了解正在发生的事情的最好方法是将public
选项(后跟目录路径)传递给dev模式的GWT编译器,以便将所有生成的类输出到磁盘。但请注意:编辑器框架很难理解!
此外,如果您的编辑器在另一个包含子编辑器(您要继承)的包中扩展了其他类,那么该子编辑器必须在子类的包中可见,因此它必须是{{1在父类中,或由子类显式公开(使用非-gen
的访问器方法。)
答案 1 :(得分:2)
GWT为驱动程序将使用的每个编辑器生成一个编辑器委托(和上下文)。此委托(和上下文)需要访问它们将作为将数据传入和传出编辑器的一部分操作的子编辑器。由于它们是用Java编写的,而不是使用JSNI来访问私有字段,因此您的编辑器必须可以被同一个包中的其他类访问。
那就是说,有几种选择。第一种是明确地public
或protected
,它们可能适合您的代码风格,也可能不适合您的代码风格。第二种是通过方法公开它们,方法名称与要编辑的属性相同,可选地后缀为“Editor”。有关详细信息,请参阅http://code.google.com/webtoolkit/doc/latest/DevGuideUiEditors.html#Editor_contract。
此限制与uibinder限制相同 - 必须可以从生成的类读取/写入字段。如果您只有private Label nameEditor;
,那么您的IDE可能会抱怨您未使用它,因为它无法看到未生成的可以访问此字段的代码。使其比private
更公开,清楚地表明它将在单个类之外使用。