Wie wird empfohlen, Konstanten in Kotlin zu erstellen? Und wie lautet die Namenskonvention? Ich habe das nicht in der Dokumentation gefunden.
companion object {
//1
val MY_CONST = "something"
//2
const val MY_CONST = "something"
//3
val myConst = "something"
}
Oder ...?
public static final
Feld in Java entspricht, verwenden Sie esconst val
in Ihrem Begleitobjekt. Wenn Sie einprivate static final
Feld und einen öffentlichen Getter wünschen , verwenden Sie esval
in Ihrem Begleitobjekt.Antworten:
Wenn Sie in Kotlin die lokalen Konstanten erstellen möchten, mit denen in der Klasse verwendet werden soll, können Sie sie wie folgt erstellen
Und wenn Sie eine öffentliche Konstante in Kotlin wie das öffentliche statische Finale in Java erstellen möchten , können Sie sie wie folgt erstellen.
quelle
Constants.kt
oder wie?companion object
Ich denke, @piotrpo Antwort sollte die akzeptierte seinVermeiden Sie die Verwendung von Begleitobjekten. Hinter der Haube werden Getter- und Setter-Instanzmethoden erstellt, damit auf die Felder zugegriffen werden kann. Das Aufrufen von Instanzmethoden ist technisch teurer als das Aufrufen statischer Methoden.
Definieren Sie stattdessen die Konstanten in
object
.Empfohlene Praxis :
und greifen Sie global wie folgt darauf zu:
DbConstants.TABLE_USER_ATTRIBUTE_EMPID
quelle
const val
Objekt in einem Begleitobjekt von einem Objektconst val
in einem normalen Objekt unterscheiden (dh der einzige Unterschied zwischen Ihren Beispielen scheint darin zu bestehen, dass Sieconst
im Fall eines Begleitobjekts weggelassen haben - wenn Sie hinzufügenconst
, sollten die Beispiele dieselbe Leistung haben)const val
s enthalten muss, ist die Deklaration von acompanion object
korrekt.Erstens ist die Namenskonvention in Kotlin für Konstanten dieselbe wie in Java (z. B. MY_CONST_IN_UPPERCASE).
Wie soll ich es erstellen?
1. Als Top-Level-Wert (empfohlen)
Sie müssen nur Ihre Konstante außerhalb Ihrer Klassendeklaration platzieren.
Zwei Möglichkeiten : Deklarieren Sie Ihre Konstante in Ihrer Klassendatei (Ihre Konstante hat eine klare Beziehung zu Ihrer Klasse).
Erstellen Sie eine dedizierte constants.kt-Datei, in der diese globalen const gespeichert werden (hier möchten Sie Ihre const in Ihrem Projekt weit verbreitet verwenden):
Dann müssen Sie es nur noch dort importieren, wo Sie es benötigen:
2. Deklarieren Sie es in einem Begleitobjekt (oder einer Objektdeklaration).
Dies ist viel weniger sauber, da unter der Haube beim Generieren von Bytecode ein nutzloses Objekt erstellt wird:
Noch schlimmer, wenn Sie es als Wert anstelle einer Konstante deklarieren (der Compiler generiert ein nutzloses Objekt + eine nutzlose Funktion):
Hinweis :
In Kotlin kann const nur primitive Typen enthalten. Wenn Sie eine Funktion an sie übergeben möchten, müssen Sie die Annotation @JvmField hinzufügen. Zur Kompilierungszeit wird es als öffentliche statische Endvariable transformiert. Aber es ist langsamer als bei einem primitiven Typ. Versuche es zu vermeiden.
quelle
Zum Zeitpunkt der Kompilierung bekannte Werte können (und sollten meiner Meinung nach) als konstant markiert werden.
Namenskonventionen sollten Java-Konventionen folgen und bei Verwendung aus Java-Code richtig sichtbar sein (mit Begleitobjekten ist dies jedoch irgendwie schwierig zu erreichen, aber trotzdem).
Die richtigen konstanten Deklarationen sind:
quelle
Naming conventions should follow Java ones
- Warum?If in doubt, default to the Java Coding Conventions
Sie benötigen keine Klasse, kein Objekt oder ein Begleitobjekt, um Konstanten in Kotlin zu deklarieren. Sie können einfach eine Datei deklarieren, die alle Konstanten enthält (z. B. Constants.kt, oder Sie können sie auch in eine vorhandene Kotlin-Datei einfügen) und die Konstanten direkt in der Datei deklarieren. Die zur Kompilierungszeit bekannten Konstanten müssen mit markiert sein
const
.In diesem Fall sollte es also sein:
const val MY_CONST = "something"
und dann können Sie die Konstante importieren mit:
import package_name.MY_CONST
Sie können auf diesen Link verweisen
quelle
Wenn Sie Ihren
const val valName = valValue
vor den Klassennamen setzen, wird auf diese Weise ein erstelltpublic static final YourClass.Kt
das wird diepublic static final
Werte haben.Kotlin :
Java dekompiliert:
quelle
Sie haben zwei Möglichkeiten: Sie können das
const
Schlüsselwort oder das Schlüsselwort verwenden@JvmField
, wodurch es zur statischen Endkonstante von Java wird.Wenn Sie die
@JvmField
Annotation verwenden, wird die Konstante nach dem Kompilieren für Sie so eingegeben, wie Sie es in Java nennen würden.Genau wie Sie es in Java aufrufen würden, ersetzt der Compiler dies für Sie, wenn Sie die Companion-Konstante im Code aufrufen.
Wenn Sie jedoch das Schlüsselwort const verwenden, wird der Wert der Konstante inline. Mit Inline meine ich, dass der tatsächliche Wert nach dem Kompilieren verwendet wird.
Zusammenfassend lässt sich sagen, was der Compiler für Sie tun wird:
quelle
Kotlin statische und konstante Wert & Methode deklarieren
}}
Zugriffswert überall
quelle
Ebenso
val
sind mit demconst
Schlüsselwort definierte Variablen unveränderlich. Der Unterschied besteht darin, dassconst
er für Variablen verwendet wird, die zur Kompilierungszeit bekannt sind.Das Deklarieren einer Variablen
const
ähnelt dem Verwenden desstatic
Schlüsselworts in Java.Mal sehen, wie man eine const-Variable in Kotlin deklariert:
Und der in Java geschriebene analoge Code wäre:
Hinzufügen zu den obigen Antworten -
Statische Felder
Normalerweise sind diese Felder privat, aber sie können auf eine der folgenden Arten verfügbar gemacht werden:
@JvmField
Anmerkung;lateinit
Modifikator;const
Modifikator.Weitere Details finden Sie hier - https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#instance-fields
quelle
Etwas, das in keiner der Antworten erwähnt wird, ist der Aufwand für die Verwendung
companion objects
. Wie Sie hier lesen können , sind Begleitobjekte tatsächlich Objekte, und das Erstellen dieser Objekte verbraucht Ressourcen. Darüber hinaus müssen Sie möglicherweise jedes Mal, wenn Sie Ihre Konstante verwenden, mehr als eine Getter-Funktion durchlaufen. Wenn Sie nur ein paar primitive Konstanten benötigen, sind Sie wahrscheinlich besser dranval
, um eine bessere Leistung zu erzielen und die zu vermeidencompanion object
.TL; DR; des Artikels:
Die Verwendung eines Begleitobjekts dreht diesen Code tatsächlich
In diesen Code:
Also versuche sie zu vermeiden.
quelle
lokale Konstanten:
Globale Konstanten:
Zugriff auf MyConstants.NAME
quelle
Es gibt einige Möglichkeiten, wie Sie Konstanten in Kotlin definieren können:
Begleitobjekt verwenden
Sie können den obigen Begleitobjektblock in jeder Klasse verwenden und alle Ihre Felder in diesem Block selbst definieren. Bei diesem Ansatz gibt es jedoch ein Problem, heißt es in der Dokumentation:
Wenn Sie Ihre Konstanten mit einem Begleitobjekt erstellen und den dekompilierten Bytecode sehen , sehen Sie wie folgt aus:
Von hier aus können Sie leicht sehen, was in der Dokumentation gesagt wurde, obwohl die Mitglieder von Begleitobjekten in anderen Sprachen wie statische Elemente aussehen. Zur Laufzeit sind dies immer noch Instanzmitglieder von realen Objekten. Es erledigt zusätzliche Arbeit als erforderlich.
Jetzt kommt ein anderer Weg, bei dem wir kein Begleitobjekt wie unten verwenden müssen.
Wenn Sie wieder die dekompilierte Version des Bytecodes des obigen Snippets sehen, werden Sie so etwas finden:
Wenn Sie nun den oben dekompilierten Code sehen, wird für jede Variable eine get-Methode erstellt. Diese get-Methode ist überhaupt nicht erforderlich.
Um diese get-Methoden loszuwerden , sollten Sie const vor val wie unten verwenden.
Wenn Sie nun den dekompilierten Code des obigen Snippets sehen, ist das Lesen einfacher, da der Code am wenigsten im Hintergrund konvertiert wird.
Dies ist also der beste Weg, um Konstanten zu erstellen.
quelle
Für Primitive und Strings:
Für andere Fälle:
Beispiel:
quelle