Jeśli spojrzysz w enum api na metodę name()
, mówi ona, że:
Zwraca nazwę tej stałej wyliczeniowej, dokładnie taką, jaka została zadeklarowana w deklaracji wyliczenia. Większość programistów powinna używać metody toString zamiast tej, ponieważ metoda toString może zwracać bardziej przyjazną dla użytkownika nazwę. Ta metoda jest przeznaczona głównie do stosowania w specjalnych sytuacjach, w których poprawność zależy od uzyskania dokładnej nazwy, która nie będzie się różnić w zależności od wydania.
Dlaczego lepiej używać toString()
? Chodzi mi o to, że toString może zostać zastąpione, gdy name () jest już ostateczna. Więc jeśli użyjesz toString i ktoś nadpisze to, aby zwrócić zakodowaną na stałe wartość, cała aplikacja jest wyłączona ... Również jeśli spojrzysz na źródła, metoda toString () zwraca dokładnie i tylko nazwę. To jest to samo.
toString()
w swoim wyliczeniu, ale nikt inny nie może go rozszerzyć ani zastąpić. Nie możesz przedłużyć wyliczeń.Odpowiedzi:
To naprawdę zależy od tego, co chcesz zrobić ze zwróconą wartością:
name()
któratoString
mogła zostać zastąpionatoString
który mógł zostać zastąpiony (lub nie!).Kiedy czuję, że może to być mylące, podaję bardziej szczegółową
getXXX
metodę, na przykład:źródło
Użyj,
name()
jeśli chcesz dokonać porównania lub użyć wartości zakodowanej na stałe do wewnętrznego użytku w kodzie.Używaj,
toString()
gdy chcesz przedstawić informacje użytkownikowi (w tym programistom przeglądającym dziennik). Nigdy nie polegaj w swoim kodzie natoString()
nadaniu określonej wartości. Nigdy nie testuj go z określonym ciągiem. Jeśli twój kod zepsuje się, gdy ktoś poprawnie zmienitoString()
zwrot, to już był uszkodzony.Z javadoc (wyróżnienie moje):
źródło
name()
jest „wbudowaną” metodąenum
. To jest ostateczne i nie możesz zmienić jego realizacji. Zwraca nazwę stałej wyliczeniowej w takiej postaci, w jakiej jest zapisana, np. Dużymi literami, bez spacji itp.Porównaj
MOBILE_PHONE_NUMBER
iMobile phone number
. Która wersja jest bardziej czytelna? Wierzę w to drugie. Na tym polega różnica:name()
zawsze zwracaMOBILE_PHONE_NUMBER
,toString()
może zostać zastąpiona wartością powrotuMobile phone number
.źródło
Mobile phone number
tylko wtedy, gdy przesłonisz ją w celu zwrócenia takiej wartości. W przeciwnym razie powróciMOBILE_PHONE_NUMBER
toString()
. Haczyk polega na tym, żename()
nie można go przesłonić, ponieważ jest ostateczny.Chociaż większość ludzi ślepo postępuje zgodnie z radą javadoc, istnieją bardzo specyficzne sytuacje, w których faktycznie chcesz uniknąć metody toString (). Na przykład używam wyliczeń w moim kodzie Java, ale muszą one zostać serializowane do bazy danych iz powrotem. Gdybym używał metody toString (), technicznie rzecz biorąc, podlegałbym nadpisaniu zachowania, jak wskazali inni.
Dodatkowo można również deserializować z bazy danych, na przykład powinno to zawsze działać w Javie:
MyEnum taco = MyEnum.valueOf(MyEnum.TACO.name());
Ale nie jest to gwarantowane:
MyEnum taco = MyEnum.valueOf(MyEnum.TACO.toString());
Nawiasem mówiąc, wydaje mi się bardzo dziwne, że Javadoc wyraźnie mówi „większość programistów powinna”. Znajduję bardzo mało przypadków użycia w toString enum, jeśli ludzie używają tego dla "przyjaznej nazwy", jest to wyraźnie kiepski przypadek użycia, ponieważ powinni używać czegoś bardziej kompatybilnego z i18n, co w większości przypadków oznaczałoby użyj metody name ().
źródło
Praktycznym przykładem, gdy name () i toString () mają sens, są różne, jest wzorzec, w którym wyliczenie jednowartościowe jest używane do definiowania singletona. Z początku wygląda to zaskakująco, ale ma dużo sensu:
W takim wypadku:
źródło
name () to dosłownie nazwa tekstowa w kodzie java wyliczenia. Oznacza to, że jest ograniczony do ciągów, które mogą faktycznie pojawić się w kodzie java, ale nie wszystkie pożądane ciągi można wyrazić w kodzie. Na przykład możesz potrzebować ciągu zaczynającego się od liczby. name () nigdy nie będzie w stanie uzyskać tego ciągu.
źródło
Możesz także użyć czegoś takiego jak poniższy kod. Użyłem lomboka, aby uniknąć pisania niektórych standardowych kodów dla getterów i konstruktora.
źródło