Использование фигурных скобок внутри блока инициализации объекта - PullRequest
0 голосов
/ 01 июля 2019

Почему функция 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 ]

7 голосов
/ 01 июля 2019

Синтаксис, который вы используете, является ярлыком для объявления реализации типа 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

См. Также Что такое блок инициализации?

5 голосов
/ 01 июля 2019

new BooleanBinding() { ... } вводит анонимный дочерний класс BooleanBinding.

Теперь bind - это защищенный метод, следовательно, он не может использовать inputsAreFull.bind().

Но bind может вызываться в блоке анонимного инициализатора { ... } в теле дочернего класса.

Еще необходимо сделать замечание: поскольку объект в данный момент не полностью инициализирован; код на самом деле выполняется в конструкторе BooleanBinding (об этом заботится компилятор), метод bind не должен быть переопределенным. Для этого можно использовать private или (здесь) метод protected final.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...