为什么bind()
函数仅在作用域花括号内设置时存在?
public void initialize() {
inputsAreFull = new BooleanBinding() {
{
bind();
}
@Override
protected boolean computeValue() {
return false;
}
};
}
在花括号内时,IntelliJ自动推荐bind()
,但在花括号外不存在该功能吗?
这行不通:
public void initialize() {
inputsAreFull = new BooleanBinding() {
bind();
@Override
protected boolean computeValue() {
return false;
}
};
}
答案 0 :(得分:7)
您使用的语法是用于声明类型BooleanBinding
的实现的快捷方式。您实际上是在类声明中。
public void initialize(){
inputsAreFull = new BooleanBinding() {
// This is equivalent to a class level scope for your anonymous class implementation.
{
bind();
}
@Override
protected boolean computeValue() {
return false;
}
};
}
没有初始化程序块,您不能在类级别随机调用方法。您可以通过编写...来进行测试...
class MyClass extends BooleanBinding {
bind(); // It's not gonna be very happy with you.
@Override
protected boolean computeValue() {
return false;
}
}
IDEOne,带有正在运行的示例:http://ideone.com/EERkXB
答案 1 :(得分:5)
new BooleanBinding() { ... }
引入了BooleanBinding
的匿名子类。
现在bind
是受受保护的方法,因此不允许执行inputsAreFull.bind()
。
但是可以在子类主体中的匿名初始化程序块{ ... }
中调用bind。
还有一个需要注意的地方:由于此时对象尚未完全初始化;如果实际上在BooleanBinding构造函数中执行了代码 (由编译器负责),则方法bind
不可重写。为此,可以使用private
或(此处使用)protected final
方法。