Как я могу установить переменные экземпляра в классах, которые постоянно обновляются в зависимости от значения других переменных экземпляра? - PullRequest
0 голосов
/ 06 июня 2019

Я хочу установить переменную экземпляра, которая зависит от другой.

Я попытался определить мою новую переменную экземпляра, ссылаясь на другую.Например:

public class numbers{
    int value;
    int triple=3*value;
    .
    .
    .
}

Я ожидал, что всякий раз, когда я обновляю независимую переменную (в примере это будет value) с помощью методов класса, переменная triple обновляется вместе с новым значением value, но когда я запускаю отладчик, для зависимой переменной остается значение по умолчанию.

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Назначение в int triple = 3 * value; выполняется только один раз для значения, оцененного в это время. Между этими двумя переменными после этой точки нет никакой внутренней связи.

Распространенным способом скрытия внутренних полей является использование методов получения и установки, где вы можете заставить свой класс вести себя так, как вы хотите. В зависимости от того, как именно вы хотите, чтобы эта тройка работала, вы можете установить ее значение в сеттере для значения:

public class Numbers{
    private int value;
    private int triple;
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
        this.triple = 3 * value;
    }
    public int getTriple() {
        return triple;
    }
}

Или вы можете просто полностью избавиться от тройного поля и просто заменить его методом:

public class Numbers{
    private int value;

    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public int getTriple() {
        return 3 * value;
    }
}

Я оставил сеттер для тройного выхода в обоих случаях, так как его поведение будет зависеть от того, что вы хотите сделать, если значение не делится на три - кажется, что вы все равно хотите, чтобы значение было доступно только для чтения .. .

1 голос
/ 06 июня 2019

Эта строка кода:

int triple=3*value;

... выполняется только один раз для каждого экземпляра объекта.В этот момент value будет 0, поэтому triple также будет 0 (= 3 * 0).

Если вы хотите, чтобы что-то постоянно обновлялось, используйте метод получения (это можетбыть публичным или частным в зависимости от того, кому нужно позвонить):

public class numbers{
    int value;

    private int getTripleValue() {
        return 3 * value;
    }
}

Затем, каждый раз, когда вы звоните getTripleValue(), результат будет рассчитываться для value в тот момент времени, поэтому всегда«в курсе».

Совет от профессионала: Используйте заглавные буквы в названии вашего класса.Это стандарт, и он позволяет отличать классы от имен переменных.

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