Правильно ли сформулировать условия для констант? - PullRequest
0 голосов
/ 15 июня 2019

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

Обычно можно проверить

if(CONSTANT > 0) foo();
else bar();

, но это вызывает предупреждение «Условие всегда« ложь »» или «Условие всегда« истина »» в зависимости от значения константы.

Есть ли способ обойти это предупреждение, чтобы не допустить другого разработчика только к этим строкам?


РЕДАКТИРОВАТЬ: Я был слишком общим с моим вопросом. Извините за это.

У меня есть таймер, который через некоторое время TIME_FOR_AUTH (константа) проходит, очищает мою модель. Это мера безопасности, которая создает проблемы при тестировании. Поэтому я добавил чек if(TIME_FOR_AUTH > 0) ... к своему коду.

Теперь я получаю описанное предупреждение. Поскольку IntelliJ всегда просит меня удалить эту конструкцию (и я не одинок в этом проекте), я хотел знать, есть ли распространенная практика, делающая это в Java / какая-то возможность подавить предупреждение.

Ответы [ 2 ]

4 голосов
/ 15 июня 2019

Здесь:

if(CONSTANT > 0) foo();

Вы говорите это сами.Это константа .Таким образом, с самого начала он либо больше, либо меньше 0. Таким образом, компилятор радостно превращает вышеприведенное в:

if(...x... > 0) foo();

, где x будет фактическим значением, которое вы присвоили CONSTANT,Так что прямо здесь, во время компиляции, это превращается в

if (true)

или, может быть, if (false).

Короче говоря: переосмыслите то, что вы делаете.Возможно, вам не следует сравнивать свою КОНСТАНТУ, а что-то вроде:

LocalDateTime endTime = LocalDateTime.now().plusHours(1);

, а затем, позже:

if (LocalDateTime.now().isAfter(endTime)) {

или что-то в этом роде.

Другими словамисравнивать значение константа для определения определенного условия просто не имеет смысла.Вместо этого вы можете использовать константу для вычисления некоторого «времени окончания», а затем со временем сравнить текущее время с этим «временем окончания».Особенно при использовании такого класса, как LocalDateTime , очень легко вычислить более позднюю временную метку, как показано выше.

Правка, учитывая изменение вопроса: я все еще предлагаю НЕ иметь такойпостроить в производственном коде.Вместо этого я бы рассмотрел средства, чтобы тестовая установка могла сконфигурировать производство так, чтобы эффективно отключить такой механизм тайм-аута.Например, введя таймаут, который гарантированно не будет срабатывать в течение разумного времени выполнения теста!

4 голосов
/ 15 июня 2019

Во-первых, это просто предупреждение.

Во-вторых, вы можете подавить предупреждение, используя аннотацию @SuppressWarnings.Для предупреждения «всегда верно / ложно» это будет @SuppressWarnings("ConstantConditions")

Пример кода:

package stackoverflow;

public class SuppressWarningsExample {

    @SuppressWarnings("ConstantConditions")
    public static void main(String[] args) {
        final int value = 100;

        if (value > 0)
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}

Для IntelliJ IDEA вы также можете подавить предупреждение для выражения с помощью встроенного // noinspection <InspectionName> комментарий:

// noinspection ConstantConditions
if (value > 0)
    System.out.println("Yes");
else
    System.out.println("No");
...