Enum czy interfejs ze stałymi?


Enum czy interfejs ze stałymi?

Czy interfejs ze zmiennymi to dobra praktyka programistyczna? NIE!

interface OlympicMedal {
  String GOLD   = "Gold";
  String SILVER = "Silver";
  String BRONZE = "Bronze";
}

Zmienne które są zadeklarowane w interfejsie są domyślnie publiczne, statyczne i finalne. Z pozoru może wydawać się, że to dobra praktyka ale przypomnijmy sobie podstawowe założenia programowania obiektowego:

  • Interfejs ma określać zachowanie, zmienne tego nie realizują,
  • Interfejs powinien reprezentować typ danych, interfejs ze stałymi nie spełnia tego założenia.

Ponadto:

  • Klasy które implementują dany interfejs w podpowiedziach (w swojej przestrzeni nazw) zanieczyszczają API programu.

Rozwiązanie? Użycie wyliczeń (z ang. enum).

enum OlympicMedalEnum {
    
    GOLD("Gold"),
    SILVER("Silver"),
    BRONZE("Bronze");
    
    String medal;
    
    private OlympicMedalEnum(String medal) {
        this.medal = medal;
    }
}

Użycie wyliczenia zabezpiecza przed podaniem niekontrolowanych wartości na etapie kompilacji:

private static void showWinnerMsg(OlympicMedalEnum medal, String winner) {
     System.out.println("The winner is " + winner + " " + medal.medal);
}
OlympicMedalEnum gold = OlympicMedalEnum.GOLD;
showWinnerMsg(gold, "James");

Wynik:

The winner is James Gold

Jeśli podamy none jako argument w postaci Stringa:

showWinnerMsg("none", "James");

otrzymamy błąd na etapie kompilacji:

error: incompatible types: String cannot be converted to OlympicMedalEnum
        showWinnerMsg("none", "James");

Użycie interfejsu ze zmiennymi to antywzorzec którego należy się wystrzegać w swoich aplikacjach.


Leave a comment

Your email address will not be published.


*