【发布时间】:2011-11-26 21:36:09
【问题描述】:
有没有办法从静态嵌套类中引用外部类的非静态字段?
请看我下面的代码:
public class TestComponent {
String value;
public void initialize(String value) {
this.value = value;
}
public static class TestLabel extends GenericForwardComposer {
Label testLabel;
@Override
public void doAfterCompose(Component comp) throws Exception {
super.doAfterCompose(comp);
testLabel.setValue(value);
}
}
}
当我尝试对非静态字段进行静态引用时,此代码会在 testLabel.setValue(value) 处引发错误。但是,我需要该值是非静态的,并且在静态嵌套类的方法中引用它。我该怎么做?
您可能会注意到我在这里实例化 TestComponent.java 的方式:http://top.cs.vt.edu/~vsony7/patches/gfc.patch
这个想法是动态地创建两个具有两个不同值“标签 1”和“标签 2”的标签,并将它们附加到两个不同的组件,即 vlayout1 和 vlayout2。但是,当我运行此代码时,每个布局都会附加一个标签,但两个标签的值都是“标签 2”。您可以在以下位置进行测试:
问题在于 testlabel.zul 中由两次调用 IncludeBuilder 创建的两个窗口共享静态类 TestLabel。在 super.doAfterCompoe() 之后,测试标签的值在两个调用中都设置为“标签 2”。
我正在使用 Zk 框架,并且 ZK 没有封闭实例,因此内部嵌套类 TestLabel 必须是静态的。
谢谢, 索尼
【问题讨论】:
-
我认为没有办法完全按照您的意愿行事。如您所说,加载内部类时尚未实例化该类,因此尚未实例化 value 字段。 TestLabel真的需要是静态的吗?
-
你的内部类必须是
static吗?如果是,你能不能为TestLabel创建一个构造函数并将value传递给它? -
@nicholas.hauschild:请查看我编辑的问题。内部类必须是静态的。此外,TestLabel 类中的每个字段都引用在单独的 zul 文件中创建的 UI 组件。所以,我不认为我可以在内部类中创建“值”字段并在构造函数中设置其值。
-
是什么创建了
TestLabel的实例?如果您无法将内部类更改为非静态,则需要某种方式将值传递给该实例。
标签: java static-members nested-class zk