Oggi ho riscontrato uno strano problema con i costruttori della classe case. Volevo rendere privato un costruttore e sembra che non sia un problema. Quindi l'ho provato in uno dei miei progetti e funziona. Ma in un altro progetto posso invocare il costruttore privato e lo compila. Ho pensato che fosse qualcosa con la mia ide, quindi ho creato una lezione autonoma e la ho compilata con scalac. E compila. Ecco il codice:Il costruttore privato Scala class di classe non è privato
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")
}
La cosa divertente è che se io uncomment bar.doStuff() non sarà compilato. Quindi in questo caso presumo lavori privati, ma in qualche modo non funziona per il costruttore. Che cosa sto facendo di sbagliato? scalac è 2.11.8
Esattamente. 'val bar = new Bar (" 12345 ")' non funziona – nmat
Grazie per la risposta. Sapevo di applicare il metodo, ma in qualche modo non ci pensavo qui. Per quanto riguarda la tua domanda, voglio avere un campo inizializzato nel metodo apply e solo lì. –
@ArtemMalinko probabilmente sarà più semplice renderlo una normale classe (con opzionalmente un oggetto complementare) in modo da avere il pieno controllo sul costruttore e sul metodo 'apply'. Nota che le classi di casi sono in realtà solo zucchero sintattico, puoi anche fare tutto il necessario con una classe regolare (ma dovrai scrivere alcune cose tu stesso). – Jesper