Ich versuche, ein echtes Äquivalent für Javas public static final
in Scala zu erhalten, um TwiP zu verwenden.
Das Erstellen eines val
in einem object
funktioniert nicht für mich, weil es Teil einer neu generierten Klasse Example$.class
ist und TwiP kann nicht von der Klasse Example.class
darauf zugreifen.
Hier ist ein Beispiel für eine Java-Klasse, die ich nach Scala portieren möchte:
%Vor% Aber ich weiß nicht, wie ich die public static final
nach Scala portieren soll. Wenn es ein Wert in einem Objekt wie hier ist
Ich bekomme nur die folgende Ausnahme:
%Vor%Wie kann ich das Problem mit Scala lösen?
Die val
-Definition im Companion-Objekt erstellt Ihre public static final
-Variable und die import
-Deklaration bietet einen schönen einfachen Alias im Code, mit dem Sie die Klasse schreiben.
Beachten Sie, dass die Variable public static final
in Scala immer noch so kompiliert wird, dass sie wie ein Aufruf einer statischen Methode aussieht, wenn Sie diesen Code von Java aufrufen.
Bearbeiten: Ich bin ein bisschen falsch wegen eines Fehlers in Scala 2.7, den ich ausführlich in einer anderen Antwort demonstriere.
Der folgende Scala-Code:
%Vor%Erzeugt die folgenden Java-Klassen:
%Vor%Der folgende Scala-Code:
%Vor%Erzeugt die folgenden Java-Klassen:
%Vor%Die Tatsache, dass statische Member nicht in der Klasse definiert sind, wenn das Objekt denselben Namen wie die Klasse hat, ist Scala Bug # 1735 und in Scala 2.8 Snapshots behoben.
Es sieht also so aus, als ob TwiP überhaupt nicht funktioniert, wenn Sie nicht entweder Scala upgraden oder einen Weg finden, TwiP mit nicht-statischen Parametergenerierungsmethoden zu arbeiten.
Sie müssen die Variable nur als "val" in einem Begleitobjekt definieren.
%Vor%HINWEIS: endgültige statische Variablen in scala folgen nicht der gleichen Konvention wie in Java. Schau dir an: Ссылка
Wenn Sie eine Variable verwenden, können Sie einen eigenen Getter und Setter erstellen, und wenn der Wert bereits festgelegt ist, ändern Sie ihn nicht.
Das ist vielleicht nicht der beste Ansatz, aber es wäre hilfreich, wenn Sie erklären könnten, warum Sie public static final
für eine Variable verwenden möchten, da eine bessere Lösung dann offensichtlich ist.