Eleganter Weg zur Enumeration mit Case-Objekt

8

Ich versuche, Enum-Verhalten mit Case-Objekt zu simulieren. Es fühlt sich ein wenig ausschweifend und nicht elegant an und ich frage mich, ob es einen besseren Weg gibt, dies zu erreichen.

Hier ist ein Beispiel:

%Vor%

Gibt es eine bessere Möglichkeit, diese umgekehrte Zuordnung von einer Zeichenfolge zum eigentlichen Fallobjekt zu erhalten? Oder generell besser umsetzen?

    
Tomer 03.03.2016, 15:30
quelle

3 Antworten

10

Ich bevorzuge einen solchen Ansatz:

%Vor%

um einen Wert zu erhalten:

%Vor%

um alle Werte zu erhalten:

%Vor%     
Mariusz Beltowski 03.03.2016 17:00
quelle
2

Basic enumerations in Scala sind ungeschickt:

  1. Wenn Sie sie in der Mustererkennung verwenden möchten, sehen Sie die nächste Warnung nicht durch den Compiler "die Übereinstimmung ist möglicherweise nicht erschöpfend" und Sie können unerwarteterweise mit scala.MatchError in der Laufzeit konfrontiert werden / li>
  2. Sie sind nicht kompatibel mit Java's enum - es ist nicht sehr beängstigend, wenn Sie API für Java nicht unterstützen, aber wenn Sie es tun, kann es eine unerwartete Enttäuschung für Sie sein.
  3. Überladen mit nicht funktionierenden Scala-Enumerationen aufgrund der gleichen Art von Enumerationen nach dem Löschen. Daher ist der nächste Code-Snapshot nicht gültig:

    %Vor%

Es wird error: double definition: have the same type after erasure: (x: Enumeration#Value)String geworfen. Wie Sie sehen, ist scala.Enumeration nicht benutzerfreundlich und verwenden Sie es lieber nicht, es wird Ihnen das Leben erleichtern.

Richtige Ansätze: Der richtige Ansatz ist die Kombination von case object oder object mit sealed class:

%Vor%

Sie können auch wrapper object für die Enumeration nicht verwenden:

%Vor%

Nutzung der Bibliothek von Drittanbietern - Enumeratum kann auch das Problem von scala.enumeration lösen, es ist eine typsichere und mächtige Enumerationsimplementierung und einfach zu bedienen und zu verstehen.

%Vor%     
Artem Rukavytsia 13.10.2017 16:35
quelle
-2

Ich bevorzuge einen solchen Ansatz

%Vor%

ScalaEnum

Das Schöne daran ist, dass Sie dieses Muster verwenden können

%Vor%     
user2928738 22.03.2016 13:22
quelle

Tags und Links