Es gibt einige Möglichkeiten, wie Sie Konstanten in Kotlin definieren können:
Begleitobjekt verwenden
companion object {
const val ITEM1 = "item1"
const val ITEM2 = "item2"
}
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:
Obwohl die Mitglieder von Begleitobjekten in anderen Sprachen wie statische Elemente aussehen, sind diese zur Laufzeit immer noch Instanzmitglieder von realen Objekten und können beispielsweise Schnittstellen implementieren.
Wenn Sie Ihre Konstanten mit einem Begleitobjekt erstellen und den dekompilierten Bytecode sehen , sehen Sie wie folgt aus:
ClassName.Companion Companion = ClassName.Companion.$$INSTANCE;
@NotNull
String ITEM1 = "item1";
@NotNull
String ITEM2 = "item2";
public static final class Companion {
@NotNull
private static final String ITEM1 = "item1";
@NotNull
public static final String ITEM2 = "item2";
// $FF: synthetic field
static final ClassName.Companion $$INSTANCE;
private Companion() {
}
static {
ClassName.Companion var0 = new ClassName.Companion();
$$INSTANCE = var0;
}
}
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.
object ApiConstants {
val ITEM1: String = "item1"
}
Wenn Sie wieder die dekompilierte Version des Bytecodes des obigen Snippets sehen, werden Sie so etwas finden:
public final class ApiConstants {
private static final String ITEM1 = "item1";
public static final ApiConstants INSTANCE;
public final String getITEM1() {
return ITEM1;
}
private ApiConstants() {
}
static {
ApiConstants var0 = new ApiConstants();
INSTANCE = var0;
CONNECT_TIMEOUT = "item1";
}
}
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.
object ApiConstants {
const val ITEM1: String = "item1"
}
Wenn Sie nun den dekompilierten Code des obigen Snippets sehen, ist das Lesen einfacher, da der Code am wenigsten im Hintergrund konvertiert wird.
public final class ApiConstants {
public static final String ITEM1 = "item1";
public static final ApiConstants INSTANCE;
private ApiConstants() {
}
static {
ApiConstants var0 = new ApiConstants();
INSTANCE = var0;
}
}
Dies ist also der beste Weg, um Konstanten zu erstellen.
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.