2013-03-06 3 views
5

Betrachten Sie diese FallklasseInstantiate Fall-Klasse mit den Werten für seine Mitglieder zu setzen

case class sample(val s: String = { /*compiled code*/ }) 
{ 
    val name:String = { /*compiled code*/ } 
    val no:Int = { /*compiled code*/ } 
} 

ich Instanz dieser Klasse mit bestimmten Werten zu Namen gesetzt erstellen müssen und nein. Aber ich kann keine andere Klasse verwenden, die diese Klasse erweitert. Ich muss die gleiche Klasseninstanz übergeben.

Antwort

1

Und machen name und no Konstruktor Parameter ist keine Option?

case class Sample(s: String = { /*compiled code*/ }, 
        name: String = { /*compiled code*/ }, 
        no: Int = { /*compiled code*/ }) 

Ich nehme an, dass die /* compiled code */ die Standardwerte der Felder bestimmt. Sie können den Code wie folgt verwenden:

Sample()     // all default values 
Sample("some value for s") // default values for name and no 
Sample("s", "name", 123) // explicit values, no defaults 
+0

Ich denke nein, weil es aussieht wie ein Code von Drittanbietern aus Glas mit IntelliJ IDEE –

+0

@ Pagoda_5b in der Tat, danke verdaut. –

2

bedeuten Sie jemand die Mühe sicher gegangen machen name und no eine bestimmte Art und Weise festgelegt und kann nicht geändert werden, und Sie wollen sie etwas anderes enthalten machen, die kann alle möglichen Annahmen verletzen? Das ist keine gute Idee, und die JVM wird dich davon abhalten, etwas so Dummes zu tun (abgesehen von absurd schwierigen Tricks, die benutzerdefinierte Klassenlader für alles beinhalten).

Wenn Sie nur meinen, Sie wollen diese Vals setzen, aber nicht in der Regel über sie im Konstruktor kümmern müssen, dann gibt es eine Vielzahl von Lösungen. Eine davon ist faul vals und private Vars mit Setter zu verwenden:

case class C(val s: String = "fish") { 
    private var myN: Option[Int] = None 
    def initializeN(n0: Int) { 
    myN = Some(n0) 
    if (n != n0) throw new Exception("Already initialized") 
    } 
    lazy val n: Int = myN.getOrElse(s.length) // s.length is your code block 
} 

, die wie so funktioniert:

scala> C("salmon") 
res0: C = C(salmon) 

scala> res0.initializeN(2); res0.n 
res1: Int = 2 

scala> C("herring") 
res1: C = C(herring) 

scala> res1.n 
res2: Int = 5 

scala> res1.initializeN(2) 
java.lang.Exception: Already initialized 
    at C.initializeN(<console>:11) 
     ... 

Es gibt verschiedene andere Tricks, die Sie spielen können, wenn Sie wollen Kompilierung-Sicherheit der Initialisierung. Später Parametersätze können zu früheren beziehen, und erscheinen nicht als Spiel Argumente:

case class D(val s: String = "fish")(val n: Int = s.length) {} 

Sie Konstrukteurs überlasten:

case class E(val s: String, n: Int) { 
    def this(s: String) = this(s, s.length) 
    def this() = this("fish") 
} 

und verschiedene Mischungen der oben genannten sind ebenfalls möglich.

+0

Ich möchte die Instanz dieser Klasse mit geänderten Werten zurücksenden. – user2140033

+0

@ user2140033 - Sie dürfen nicht. Die Werte sind unveränderlich. Sie können sie nicht ändern. Ich kann nicht anfangen zu sagen, wie schrecklich es Dinge brechen würde, wenn es trivial wäre, Werte zu ändern, die sich als nie verändernd erweisen. –

Verwandte Themen