Wenn Sie sich in der Enum-API die Methode ansehen name()
, heißt es:
Gibt den Namen dieser Aufzählungskonstante genau so zurück, wie er in der Aufzählungsdeklaration deklariert ist. Die meisten Programmierer sollten die toString-Methode gegenüber dieser bevorzugen, da die toString-Methode möglicherweise einen benutzerfreundlicheren Namen zurückgibt. Diese Methode wurde hauptsächlich für den Einsatz in speziellen Situationen entwickelt, in denen die Richtigkeit davon abhängt, den genauen Namen zu erhalten, der von Version zu Version nicht variiert.
Warum ist es besser zu benutzen toString()
? Ich meine, toString kann überschrieben werden, wenn name () bereits endgültig ist. Wenn Sie also toString verwenden und jemand es überschreibt, um einen fest codierten Wert zurückzugeben, ist Ihre gesamte Anwendung ausgefallen ... Auch wenn Sie in den Quellen nachsehen, gibt die toString () -Methode genau und nur den Namen zurück. Das ist gleich.
toString()
Ihre Aufzählung überschreiben , aber niemand anderes kann sie erweitern und überschreiben. Sie können keine Aufzählungen verlängern.Antworten:
Es hängt wirklich davon ab, was Sie mit dem zurückgegebenen Wert tun möchten:
name()
alstoString
möglicherweise überschriebenen gewesen seintoString
die möglicherweise überschrieben wurde (oder nicht!).Wenn ich das Gefühl habe, dass es verwirrend sein könnte, biete ich eine spezifischere
getXXX
Methode an, zum Beispiel:quelle
Verwenden
name()
Sie diese Option, wenn Sie einen Vergleich durchführen oder den fest codierten Wert für eine interne Verwendung in Ihrem Code verwenden möchten.Verwenden
toString()
Sie diese Option, wenn Sie einem Benutzer Informationen präsentieren möchten (einschließlich eines Entwicklers, der ein Protokoll betrachtet). Verlassen Sie sich in Ihrem Code niemals darauftoString()
, einen bestimmten Wert anzugeben. Testen Sie es niemals gegen eine bestimmte Saite. Wenn Ihr Code beschädigt wird, wenn jemand dietoString()
Rückgabe korrekt ändert , war er bereits fehlerhaft.Aus dem Javadoc (Schwerpunkt Mine):
quelle
name()
ist eine "eingebaute" Methode vonenum
. Es ist endgültig und Sie können seine Implementierung nicht ändern. Es gibt den Namen der Enum-Konstante zurück, wie er geschrieben ist, z. B. in Großbuchstaben, ohne Leerzeichen usw.Vergleiche
MOBILE_PHONE_NUMBER
undMobile phone number
. Welche Version ist besser lesbar? Ich glaube der zweite. Dies ist der Unterschied:name()
Immer zurückMOBILE_PHONE_NUMBER
,toString()
kann überschrieben werden, um zurückzukehrenMobile phone number
.quelle
Mobile phone number
nur zurück, wenn Sie es überschreiben, um einen solchen Wert zurückzugeben. Andernfalls wird es zurückkehrenMOBILE_PHONE_NUMBER
toString()
. Der Haken ist, dassname()
nicht überschrieben werden kann, da es endgültig ist.Während die meisten Menschen blind den Ratschlägen des Javadoc folgen, gibt es sehr spezielle Situationen, in denen Sie toString () tatsächlich vermeiden möchten. Zum Beispiel verwende ich Enums in meinem Java-Code, aber sie müssen in eine Datenbank serialisiert und wieder zurück. Wenn ich toString () verwenden würde, würde ich technisch dazu neigen, das überschriebene Verhalten zu erhalten, wie andere darauf hingewiesen haben.
Zusätzlich kann man auch aus der Datenbank de-serialisieren, dies sollte beispielsweise immer in Java funktionieren:
MyEnum taco = MyEnum.valueOf(MyEnum.TACO.name());
Dies ist jedoch nicht garantiert:
MyEnum taco = MyEnum.valueOf(MyEnum.TACO.toString());
Übrigens finde ich es sehr seltsam für den Javadoc, explizit zu sagen, "die meisten Programmierer sollten". Ich finde sehr wenig Anwendungsfälle im toString einer Aufzählung, wenn Leute das für einen "freundlichen Namen" verwenden, ist dies eindeutig ein schlechter Anwendungsfall, da sie etwas verwenden sollten, das mit i18n kompatibler ist, was in den meisten Fällen der Fall wäre. Verwenden Sie die Methode name ().
quelle
Ein praktisches Beispiel, wenn name () und toString () sinnvoll sind, um sich zu unterscheiden, ist ein Muster, bei dem einwertige Aufzählung zum Definieren eines Singletons verwendet wird. Es sieht auf den ersten Blick überraschend aus, macht aber sehr viel Sinn:
In diesem Fall:
quelle
name () ist buchstäblich der Textname im Java-Code der Aufzählung. Das bedeutet, dass es auf Zeichenfolgen beschränkt ist, die tatsächlich in Ihrem Java-Code erscheinen können, aber nicht alle gewünschten Zeichenfolgen im Code ausgedrückt werden können. Beispielsweise benötigen Sie möglicherweise eine Zeichenfolge, die mit einer Zahl beginnt. name () kann diese Zeichenfolge niemals für Sie abrufen.
quelle
Sie können auch den folgenden Code verwenden. Ich habe Lombok verwendet, um zu vermeiden, dass einige der Boilerplate-Codes für Getter und Konstrukteure geschrieben werden.
quelle