Dies ist eine Folgefrage an my previous initialization variable question.Wie simuliert man eine "Assign-Once" -Var in Scala?
Angenommen wir mit diesem Kontext zu tun hat:
object AppProperties {
private var mgr: FileManager = _
def init(config: Config) = {
mgr = makeFileManager(config)
}
}
Das Problem mit diesem Code ist, dass jedes andere Verfahren in AppProperties
mgr
zuweisen könnte. Gibt es eine Technik, um mgr
besser zu verkapseln, so dass es sich wie ein val
für die anderen Methoden anfühlt? Ich habe wie diese über etwas gedacht (inspiriert von this answer):
object AppProperties {
private object mgr {
private var isSet = false
private var mgr: FileManager = _
def apply() = if (!isSet) throw new IllegalStateException else mgr
def apply(m: FileManager) {
if (isSet) throw new IllegalStateException
else { isSet = true; mgr = m }
}
}
def init(config: Config) = {
mgr(makeFileManager(config))
}
}
... aber das fühlt sich eher im Schwergewicht zu mir (und Initialisierung erinnert mich zu sehr an C++ :-)). Irgendeine andere Idee?
Aber wie ich es jetzt sehe, könnten Sie immer die 'SetOne.allowMe' Credential irgendwo in Ihrem Code (im Vergleich zu der' versiegelten' Version) abrufen und Zuordnung würde funktionieren solange es die erste Aufgabe ist. Im Grunde genommen ist der implizite Berechtigungsnachweis jetzt nutzlos. Oder fehlt mir etwas? – Debilski
Zuordnung funktioniert nicht von überall in meinem Code, da 'mgr' privat ist, aber Sie haben Recht, das ist ein kleiner Nachteil. Aber ist das wirklich schlimmer als die Version von axel22, wo ich einen anderen 'Access' irgendwo in der gleichen Datei erstellen könnte? (Ich könnte 'Base' in eine andere Datei verschieben, um die 100% -Garantie zu bekommen, aber wäre das nicht nur für die Initialisierung eines Feldes zu viel? Ich würde es lieber in der gleichen Datei behalten und einen besseren Überblick bekommen) . Zweitens bevorzuge ich die leicht wiederzuverwendende 'SetOnce' im Gegensatz zu einer ausführlicheren Lösung, die es erfordern würde, dass ich neue Zugriffsmerkmale für jedes neue Set-once var ... –
Es ist nicht besser oder schlechter, es ist nur, dass die Anmeldeinformationen nutzlos sind Ihr Fall, weil Sie 'SetOnce.allowMe' von überall in Ihrem Code aufrufen können und somit die Berechtigungsvariable erhalten. Du gewinnst dadurch eigentlich nichts. – Debilski