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.
Ich denke nein, weil es aussieht wie ein Code von Drittanbietern aus Glas mit IntelliJ IDEE –
@ Pagoda_5b in der Tat, danke verdaut. –