2011-06-26 11 views
9

Co to jest dobra praktyka podczas definiowania wyliczenia?Praktyki enum - Zdefiniuj wewnątrz klasy/osobno, uczyń publiczną/prywatną

Na przykład mam klasę Person. Dla tej klasy zdecydowałem się użyć wyliczenia, które ma wartości MALE i FEMALE.

Czy enum należy zdefiniować w klasie Person lub osobno? Czy enum powinien być zdefiniowany jako prywatny czy publiczny? Czy masz jeszcze jakieś porady, dzięki którym korzystanie z enum będzie tak elastyczne, jak to tylko możliwe?

Odpowiedz

8

IMHO, spraw, by był to public static enum wewnątrz class Person.

Powód jest taki, że enum Gender dotyczy tylko osoby, więc umieść ją tam, aby były ze sobą powiązane (płeć nie ma zastosowania bez kontekstu osoby).

Plusem:

  • mniej klasa uwędzić
  • po przeniesieniu osoby do innego pakietu/projektu Płeć zawsze przyjść z nim
  • osoba, która jest jedynym użytkownikiem, ma „kontroli” z nim i może zmieniać go, jak chce, np
    • dodanie private List<HealthIssue> genderSpecificHealthIssues;
    • dodając kolejne teksty stałe, np TRANSGENDER, INTERSEX lub cokolwiek

Jedynym minusem jest to, należy użyć static import z niego korzystać, tzn import static com.company.Person.Gender.*;.

Ten wzorzec jest widoczny w wielu klasach JDK, takich jak Calendar, który definiuje wiele stałych związanych z datami, z których korzysta w klasie.

3

Aby uzyskać pełną elastyczność, dodaj go do klasy statycznej. Ale oczywiście jest to tylko i wyłącznie dla wyrażeń, które muszą być używane w całej aplikacji. W przypadku wyrażeń lokalnych i specjalistycznych lepiej jest trzymać je blisko miejsca, w którym będą używane. Exampli gratia, Mam klasę IPHandler, która sprawia, że ​​obsługa, przetwarzanie i tłumaczenie adresów IPv4 i IPv6 jest przejrzyste dla użytkownika klasy (IPHandler jest klasą statyczną). Ma jedną enum, IPType, z wartościami IPv4 i IPv6, które są używane tylko w IPHandler dla kilku operacji. Ponieważ nie jest używany nigdzie indziej, został zdefiniowany w klasie IPHandler.

+0

@leon: Dziękujemy za udostępnienie. Aby potwierdzić, IPType nie jest używane w setters/getters i jest zdefiniowane jako prywatne? –

+0

@James P. - ponieważ wywołania metod IPHandler używają wyliczenia (jak w _IPHandler.getFormattedLocal (** IPHandler.IPType ipType **)) _, muszą być dostępne spoza jego klasy nadrzędnej. Oznacza to, że nie, nie mogą być prywatne - i nie powinny mieć seterów. Czy pozwala na to Java? – leon

+0

OK, dostaję cię. Kiedy wspominałem o pobierających i ustawiających, miałem na myśli te z twojej klasy IPHandler. Konieczne jest, aby zestaw enum był publicznie dostępny, jeśli odwoływał się do metod. Zastanawiam się, w jakich przypadkach dobrym pomysłem byłoby zdefiniowanie enum jako oddzielnego pliku Java. P.S: Tylko dla szczegółów, wyliczenia mogą mieć zmienne/metody dodane, chociaż oczywiście nie mogą modyfikować rzeczywistych wartości wyliczeniowych. –