Если я пытаюсь сделать a .equals()
на пустой строке в Java будет брошено исключение нулевого указателя. Я задаюсь вопросом, если я пытаюсь выдержать сравнение, если строка равна некоторой постоянной строке, могу я делать следующее:
MY_CONSTANT_STRING.equals(aStringVariable)
Я знаю, что это будет работать, но является этим просто действительно плохой код?
Это стандартная идиома Java, в шутку называемая условием Йоды .
Лично я предпочитаю обрабатывать нулевой случай явно, но метод Йоды используется очень часто, и любой опытный программист на Java должен сразу понять, что происходит. Это нормально использовать.
То, что у вас есть, прекрасно. Можно даже использовать литерал String.
if( "value".equals(variable) ) {
...
Если вам это не нравится, вы всегда можете явно проверить на null
и равенство, и объединить эти две проверки с помощью &&
. Замыкание оператора гарантирует, что вы никогда не получите NPE.
if( (variable != null) && variable.equals("value") ) {
...
это просто очень плохой код?
Нет, многие люди именно так кодируют оператор, чтобы избежать NPE.
Если вы беспокоитесь о качестве своего кода, напишите вспомогательный класс, который позаботится о проверке равенства:
public class ObjectHelper {
public static boolean testEquality(Object o1, Object o2) {
if (o1 == null && o2 == null) return true;
if (o1 == null) return false;
return o1.equalts(o2);
}
}
Затем используйте его следующим образом:
if (ObjectHelper.testEquality(aStringVariable, My_CONSTANT_STRING))
Ваша так называемая константа МОЖЕТ перестать быть константой. В будущем она может быть считана из конфигурационного файла.
Я бы оставил код «CONSTANT.equals (possibleNull)» без нулевого теста только в том случае, если это нормальное условие, когда переменная может быть нулевой - например, потому что она только что вышла из карта собственности.
Точно так же вы можете избежать проверки на null в instanceof-check, например:
Food dinner = map.get("dinner");
if (dinner instanceof Soup) {
((Soup)blah).eat();
} // We don't care if it is a Fish or null
Но если вы действительно не ожидали null, вам следует явно проверить это в отдельном if-тесте и обработать его соответствующим образом. Как правило, такие ошибки данных лучше обнаруживать заранее, чем позже.
Нет, обычно это делается, чтобы избежать NPE. Однако я обычно предпочитаю выполнять явную проверку на null.