V případě, že máme konstantu a tu porovnáváme s objektem, je vhodnější použít konstrukci konstanta.equals(objekt) než naopak. Důvod je jednoduchý. Vyhneme se tak možnosti chyby NullPointerException.
String MY_CONSTANT = "AB9922"; System.out.println(MY_CONSTANT.equals(MY_CONSTANT)); System.out.println(MY_CONSTANT.equals("ABCDEF")); System.out.println(MY_CONSTANT.equals(null));
Výsledek.
true false false
Pokud to zkusíme opačně, kód nepůjde zkompilovat.
System.out.println(MY_CONSTANT.equals(MY_CONSTANT)); System.out.println("ABCDEF".equals(MY_CONSTANT)); // Unresolved compilation problem: Cannot invoke equals(String) on the primitive type null // System.out.println(null.equals(MY_CONSTANT));
Vědomě bychom konstrukci null.equals() určitě nepoužili, ale nevědomě se používá docela často. Zde je metoda, která vrací náhodný String. Vrácená hodnota tedy může být i null.
private static String generateString() { int randomNumber = gen.nextInt(3); switch(randomNumber) { case 0: return "AB9922"; case 1: return "XX8811"; default: return null; } }
Pokud budeme porovnávat objekty tímto způsobem,
private static final String MY_CONSTANT = "AB9922"; public static void main(String[] args) { for (int i = 0; i < 100; i++) { System.out.println(generateString().equals(MY_CONSTANT)); } }
kód nám pravděpodobně bude nějakou chvíli fungovat, ale časem se určitě objeví NullPointerException.
true true false Exception in thread "main" java.lang.NullPointerException
Předejít tomu můžeme změnou objektu, na kterém metodu equals() voláme.
for (int i = 0; i < 100; i++) { System.out.println(MY_CONSTANT.equals(generateString())); }