Переназначение значения переменной экземпляра внутри метода путем переназначения переменной аргумента метода - PullRequest
0 голосов
/ 06 августа 2020

У моего класса есть запланированный метод, который запускается каждые полсекунды и проверяет данные, чтобы увидеть, не истекло ли время ожидания какого-либо из устройств. Если время ожидания истекло не менее 5 секунд, я отправляю событие в свою базу данных (это делается методом checkSpecs, который я здесь не воспроизводил. Фактический класс довольно велик, поэтому я попытался уменьшить размер, пока сохраняя соответствующие части).

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

Поскольку мой класс очень велик и я с помощью этого метода слежу за несколькими устройствами, я попытался создать вспомогательный метод monitorConnectionStatus, который принимает два логических значения в качестве аргументов. Мой вопрос касается этого метода.

У меня сложилось впечатление, что при передаче переменных экземпляра в monitorConnectionStatus при вызове метода этот метод получает к ним доступ и может переназначить эти переменные. Это мое намерение, чтобы метод работал должным образом. Но моя IDE сообщает мне, что значение disconnectionStatus всегда будет ложным, что заставило меня задуматься: я ошибаюсь, полагая, что переменная экземпляра будет переназначена? Возможно ли, что в этом случае моя IDE просто ошибочна? переменная?


Public Class OffSpecAgent {
    private final DataModel dataModel;

    private int deviceATimeoutCounter = 0;
    private boolean isDeviceATimeout = false;
    private boolean hasADisconnected = false;

    private int deviceBTimeoutCounter = 0;
    private boolean isDeviceBTimeout = false;
    private boolean hasBDisconnected = false;

    @Scheduled(fixedDelay = 500)
    public void offSpecMonitor() {
        checkTimeouts();
        checkReconnections();
        checkSpecs();
    }

    private void checkTimeouts() {
        deviceATimeoutCounter = dataModel.getBoolean(DEVICE_A_TIMEOUT) ? deviceATimeoutCounter + 1 : 0;
        isDeviceATimeout = deviceATimeoutCounter >= 10;

        deviceBTimeoutCounter = dataModel.getBoolean(DEVICE_B_TIMEOUT) ? deviceBTimeoutCounter + 1 : 0;
        isDeviceBTimeout = deviceATimeoutCounter >= 10;
    }

    private void checkReconnections() {
        monitorConnectionStatus(isDeviceATimeout, hasADisconnected);
        monitorConnectionStatus(isDeviceBTimeout, hasBDisconnected);
    }

    private void monitorConnectionStatus(boolean timeoutCondition, boolean disconnectionStatus) {
        if (timeoutCondition) {
            disconnectionStatus = true;
        }
        if (disconnectionStatus && !timeoutCondition) {
            disconnectionStatus = false;
            //throw reconnection event
        }
    }
}

Ответы [ 2 ]

1 голос
/ 06 августа 2020

В java переменные передаются в методы по значению, то есть ваш метод monitorConnectionStatus знает только о том, что он получает false, false значений. Вам придется обновить свой метод для прямого доступа к переменной экземпляра.

private void monitorConnectionStatus() {
    if (this.timeoutCondition) {
        this.disconnectionStatus = true;
    }
    if (this.disconnectionStatus && !this.timeoutCondition) {
        this.disconnectionStatus = false;
        //throw reconnection event
    }
}

Обратите внимание, что ключевое слово this не требуется.

Кроме того, я просто хочу добавить, что вы используете термин class variable неверно. Переменные, о которых вы говорите: instance variables.

Подробнее об этом можно прочитать здесь:

https://www.tutorialspoint.com/What-are-class-variables-instance-variables-and-local-variables-in-Java

0 голосов
/ 07 августа 2020
• 1000 иметь желаемое поведение. Спасибо всем, кто ответил на мой вопрос.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...