繁体   English   中英

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

[英]Using curly braces inside object initialization block

为什么仅在范围大括号内设置函数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;
        }
    };
}

您使用的语法是用于声明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

另请参见什么是初始化块?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM