Что такое безопасность времени компиляции и безопасности времени выполнения? - PullRequest
0 голосов
/ 08 декабря 2018

Согласно этой публикации о Java Enum безопасность во время выполнения может быть достигнута с помощью оператора == для сравнения состояния и предотвращения NullPointerException.

if(testPz.getStatus() == Pizza.PizzaStatus.DELIVERED); 

Также для compile-time-safety, хотя логически сравнение оказалось ложным, эту проблему можно избежать с помощью оператора ==.

if(testPz.getStatus() == TestColor.GREEN);

Подскажите, пожалуйста, чтоcompile-time-safety и runtime-safety в Java?

Если можете, приведите небольшой пример.

1 Ответ

0 голосов
/ 08 декабря 2018

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

Безопасность во время компиляции означает, что компилятор может анализировать ваш код и гарантировать отсутствие определенных видов ошибок.В Java распространенным примером является безопасность типов (гарантируется, что объект в переменной типа List является своего рода реализацией списка).Некоторые языки, такие как Kotlin в JVM, также могут гарантировать, что исключения нулевого указателя не могут возникать, поскольку идентифицируемые переменные и ненулевые переменные идентифицируются, и требуются явные проверки.

Безопасность во время компиляции имеет своипределы, однако;например, вы можете использовать cast в Java, чтобы конкретно сказать компилятору, что «я знаю, что здесь объект определенного типа, даже если вы не можете это доказать», и если вы ошибаетесь, вы можете получить ClassCastException при запуске программы.

В статье, на которую вы ссылаетесь, рассказывается о моем втором примере, нулевой безопасности.В Java переменная ссылочного типа может иметь значение null, которое на самом деле не ссылается на реальный экземпляр, и если вы попытаетесь вызвать метод для этой переменной, вы получите NullPointerException.В этом примере, если у вас есть enum Status, тогда, если вы вызовете statusVariable.equals(VALUE), вы получите исключение, если statusVariable имеет значение null: выражение безопасно во время компиляции, но не безопасно во время выполнения, потому чтоJava не дает гарантий относительно нулевых значений.Напротив, == безопасно использовать с нулевыми значениями, поэтому даже если ваша переменная равна нулю, вы получите результат false вместо исключения.

...