Правильное использование ключевого слова Java assert

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

Итак, вместо того, чтобы спросить пример, я собираюсь предоставить его и сообщить, если это правильное использование assert.

// The idea is that the `mode` variable should be 0 or 1, and no other number.
switch(mode) {
     case 0: 
          // do stuff
          break;
     case 1:
          // do other stuff
          break;

     default:
          // assert code?
}

Если это правильно, сообщите мне, как использовать его в этом случае. Если это не так, как предполагается, используйте пример. Спасибо заранее

Ответ 1

Не в этом случае.

Если вы утверждаете значение, вы делаете выражение о том, что до того, как будет сделана критическая оценка с использованием этого значения, это то, что вы утверждаете. Вы можете утверждать, что значение не является нулевым или оно меньше 2 или что-то еще до того, как вы достигнете своего критического блока кода.

assert (mode >= 0 && mode < 2);  // Ensures that `mode` is between 0 and 1.
// Switch statement to follow

Я бы не стал поощрять использование этого здесь. Ваш код не будет хорошо читаться, и если вы не включите утверждения с флагом -ea, ваше утверждение не будет работать.

Вместо этого вы можете сделать исключение какого-либо исключения - если оно не равно 0 или 1, то mode является незаконным значением, которое невозможно обработать, что приводит к исключительной /undefined поведению. Выбросьте какое-то исключение.

switch(mode) {
    case 0: 
        // do stuff
        break;
    case 1:
        // do other stuff
        break;
    default:
      throw new IllegalArgumentException("Mode is illegal");
}

Ответ 2

assert object != null;
object.doSomething();

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

Следует помнить, что assert никогда не должно выполняться в производственном коде. Мы используем его только при тестировании. Существует опция Java, чтобы включить или выключить ее.

Что касается вашего конкретного примера, вы можете использовать:

assert mode == 0;
assert mode == 1;

в самом начале блока коммутатора, чтобы убедиться, что переданы только 0 и 1.

P.S. Обсуждение когда использовать утверждение против исключения может помочь вам понять. Идея состоит в том, что

Исключения определяют надежность вашего приложения во время утверждений обратитесь к правильности вашего приложения.

Ответ 3

Утверждения в основном используются для проверки того, что никогда не должно происходить. В некоторых утверждениях используются случаи из http://www.javapractices.com/topic/TopicAction.do?Id=102

предварительные условия (только в частных методах) - требования, которые метод требует, чтобы вызывающий пользователь выполнял. post-conditions - проверить promises, сделанный методом его вызывающей стороне инварианты класса - проверка состояния объекта unreachable-at-runtime code - части вашей программы, которые вы ожидаете быть недоступными, но которые не могут быть проверены как таковые во время компиляции (часто бывают предложения и случаи по умолчанию в операторах switch)

Таким образом, использование утверждения в вашем коде неверно