Wartości w moim enum
to słowa, które muszą zawierać spacje, ale wyliczenia nie mogą mieć spacji w swoich wartościach, więc wszystko jest zebrane. Chcę nadpisać, toString()
aby dodać te spacje tam, gdzie to powiem.
Chcę również, aby wyliczenie zapewniało prawidłowe wyliczenie, gdy używam valueOf()
tego samego ciągu, do którego dodałem spacje.
Na przykład:
public enum RandomEnum
{
StartHere,
StopHere
}
Zaproszenie toString()
na RandomEnum
którego wartość StartHere
powraca ciąg "Start Here"
. Wywołanie valueof()
tego samego ciągu ( "Start Here"
) zwraca wartość wyliczenia StartHere
.
W jaki sposób mogę to zrobić?
Odpowiedzi:
Możesz wypróbować ten kod. Ponieważ nie możesz przesłonić
valueOf
metody, musisz zdefiniować niestandardową metodę (getEnum
w przykładowym kodzie poniżej), która zwraca potrzebną wartość i zmienić klienta, aby używał tej metody.źródło
Spróbuj tego, ale nie jestem pewien, czy zadziała wszędzie :)
źródło
Możesz użyć statycznej mapy w swoim wyliczeniu, która mapuje ciągi na stałe wyliczeniowe. Użyj go w metodzie statycznej „getEnum”. Pomija to potrzebę iteracji przez wyliczenia za każdym razem, gdy chcesz uzyskać jedną z jej wartości String.
Po prostu upewnij się, że statyczna inicjalizacja mapy następuje poniżej deklaracji stałych wyliczeniowych.
Przy okazji - ten typ „ImmutableMap” pochodzi z Google guava API i zdecydowanie polecam go w takich przypadkach.
EDYCJA - Zgodnie z komentarzami:
źródło
RestartHere("replay"), ReplayHere("replay")
lub bez „wartości” podobnąPauseHere, WaitHere
(tj. Enum ma domyślny konstruktor podobny doprivate RandomEnum() { this.strVal = null; }
A co z implementacją Java 8? (wartość null można zastąpić domyślnym wyliczeniem)
Lub możesz użyć:
źródło
Nie sądzę, żebyś osiągnął valueOf („Zacznij tutaj”) do pracy. Ale jeśli chodzi o spacje ... spróbuj następujących rzeczy ...
źródło
Poniżej znajduje się ładna ogólna alternatywa dla valueOf ()
źródło
compareTo()
bardziej eleganckie niż wequals()
przypadku Strings?.equals()
będzie dobrze. Możesz użyć,==
jeśli chcesz. (Chociaż dobrym powodem, aby tego nie robić, jest zastąpienie wyliczenia klasą).Nadal masz możliwość zaimplementowania w swoim wyliczeniu tego:
źródło