2016-04-20 6 views
1

Ich beabsichtige, die Werte einzuschränken, die das Zeichenfolgenmitglied meiner Klasse annehmen kann. Zum Beispiel: für ein Mitglied mit dem Namen country, nur zulässige Werte sollten die Länder sein, die ich definiert habe wie 'US', UK, CN, usw. Diese Konstanten müssen String-Konstanten sein.Werte erzwingen, die einem Klassenmitglied zugewiesen werden können: Scala

Ich dachte an die Verwendung von Enum, aber das gibt mir keine Flexibilität mit den String-Konstanten. Oder vielleicht weiß ich nicht, wie man es benutzt.

Irgendwelche Vorschläge?

Antwort

1

Enum Unterstützung ist nicht so gut in Scala. Erstens, scala's eingebautes Enumeration ist Mist, benutze es nicht.

Der gemeinsame Ansatz für Aufzählungen ist versiegelt Merkmal/Klasse:

sealed abstract class Country(val name:String) 

object Country { 
    case object US extends Country("US") 
    case object UK extends Country("UK") 
    case object CN extends Country("CN") 

    val values = Set(US, UK, CN) 
} 

Country.values.find(_.name == "US") 

Es ein Problem ist, wenn Sie die Liste aller möglichen Werte wollen, müssen Sie sie selbst (das values Feld im Beispiel aufzuzählen über).

Es gibt jedoch Alternativen, die dieses Problem lösen. Sie können mit Makro gehen (check this thread).

Oder verwenden Sie library von Drittanbietern.

2

Was ist das Problem mit der Enum? Scheint wie eine gute Passform für das, was Sie brauchen. Hier ein Beispiel:

object Country extends Enumeration { 
    val US = Value("United States") 
    val UK = Value("United Kingdom") 
} 

case class MemberCountry(country: Country.Value) 

//example instantiation 
MemberCountry(Country.UK) 
MemberCountry(Country.withName("United States")) 
+0

i-String zuweisen möchten konstant, so sollte ich in der Lage sein kann „United States“ – konquestor

+0

@konquestor einen konstanten Country.US deren Wert zuzuweisen, der möglich ist, mit enums, siehe meine aktualisierte Antwort – nmat

0

Aufzählung hat seine Stärken und Schwächen in Scala. Sie könnten jeder Ansatz oben nämlich verwenden hervorgehoben:

  • Enumeration Unterklasse
  • Verwendung Sealed Trait/Klasse.

Beide Ansätze haben Vorteile und mögliche Kompromisse. Es könnte das Lesen durch diesen informativen Artikel zu diesem Thema lohnen: http://underscore.io/blog/posts/2014/09/03/enumerations.html

Verwandte Themen