Pořadí při použití metody equals

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()));
}

Napsat komentář