Heute habe ich ein seltsames Problem mit Fall-Klasse-Konstruktoren aufgetreten. Ich wollte einen Konstruktor privat machen und es scheint, dass es kein Problem ist. Also habe ich es in einem meiner Projekte versucht und es funktioniert. Aber in einem anderen Projekt kann ich privaten Konstruktor aufrufen und es kompiliert. Ich dachte, es ist etwas mit meiner Idee, also habe ich eine eigenständige Klasse erstellt und mit scalac kompiliert. Und es kompiliert. Hier ist der Code:Scala-Fall-Klasse privaten Konstruktor ist nicht privat
package com.test
object Main {
def main(args: Array[String]) {
val bar = Bar("12345")
// bar.doStuff()
println(bar)
}
}
case class Bar private(foo: String){
private def doStuff():Unit = println("stuff")
}
Das Komische ist, dass, wenn ich bar.doStuff Kommentar-() es nicht kompiliert werden. Ich gehe also davon aus, dass private Arbeiten in diesem Fall funktionieren, funktioniert aber irgendwie nicht für Konstrukteure. Was mache ich falsch? Scalac ist 2.11.8
Genau. 'val bar = neue Bar (" 12345 ")' wird nicht funktionieren – nmat
Vielen Dank für Ihre Antwort. Ich wusste über die Methode anwenden, aber irgendwie habe ich nicht darüber nachgedacht. Was Ihre Frage angeht, möchte ich ein Feld haben, das in der Methode apply und nur dort initialisiert wird. –
@ArtemMalinko es wird wahrscheinlich am einfachsten, es zu einer regulären Klasse (mit optional einem Companion-Objekt) zu machen, so dass Sie die volle Kontrolle über den Konstruktor und die 'Apply'-Methode haben. Beachten Sie, dass Fallklassen wirklich nur syntaktischer Zucker sind, Sie können auch alles tun, was Sie mit einem normalen Kurs brauchen (aber Sie müssen einige Dinge selbst schreiben). – Jesper