Финальная логическая переменная меняет значение - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть переменная класса, которая является окончательной и устанавливается в конструкторе. Когда я проверяю его значение в конструкторе абстрактного класса и подкласса, это правильное значение. Но когда я проверяю это позже в методе, это всегда ложно. Вот мой код.

abstract class AbstractArticleObject extends StructureObject {

    final boolean firstArticle;

    AbstractArticleObject(Element element, boolean firstArticle) {
        super(element);

        this.firstArticle = firstArticle;

        ...
    }

}

class ArticleObject extends AbstractArticleObject {

    ArticleObject(Element element, boolean firstArticle) {
        super(element, firstArticle);

        // In this method, firstArticle is whatever was passed in, which is sometimes true.
        Log.v(title, String.format(String.valueOf(this.firstArticle));
    }

    @Override
    StructureState getState() {
        // In this method, firstArticle is always false.
        Log.v(title, String.format(String.valueOf(firstArticle));

        if (...) {
            ...
        } else if (...) {
            if (firstArticle) {
                return StructureState.CAN_OPEN;
            } else {
                ...
            }
        }

        return StructureState.NOT_SET;
    }
}

Если я устанавливаю значение в конструкторе, а значение является окончательным, почему оно возвращает false, даже если для него установлено значение true?

1 Ответ

0 голосов
/ 05 сентября 2018

Откуда вызывается getState()?

Переменные final могут «измениться», если вы обращаетесь к ним до того, как они когда-либо будут инициализированы. Рассмотрим следующую крошечную программу:

public class Test {

    private final boolean value;

    public Test() {
        doSomething();
        this.value = true;
        doSomething();
    }

    private void doSomething() {
        System.out.println(value);
    }

    public static void main(String[] args) {
        new Test();
    }
}

Выход этой программы будет

false
true

Итак, если ваш getState() метод вызывается, например, из конструктор StructureObject, тогда он будет вызван до того, как конструктор AbstractArticleObject инициализирует firstArticle, и будет false.

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