在对象初始化块内使用花括号

时间:2019-07-01 14:36:52

标签: java javafx

为什么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;
        }
    };
}

2 个答案:

答案 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

另请参阅What is an initialization block?

答案 1 :(得分:5)

new BooleanBinding() { ... }引入了BooleanBinding的匿名子类。

现在bind是受受保护的方法,因此不允许执行inputsAreFull.bind()

但是可以在子类主体中的匿名初始化程序块{ ... }中调用bind。

还有一个需要注意的地方:由于此时对象尚未完全初始化;如果实际上在BooleanBinding构造函数中执行了代码 (由编译器负责),则方法bind不可重写。为此,可以使用private或(此处使用)protected final方法。