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