Istnieje kilka sposobów definiowania stałych w Kotlinie,
Korzystanie z obiektu towarzyszącego
companion object {
const val ITEM1 = "item1"
const val ITEM2 = "item2"
}
możesz użyć powyższego bloku obiektu towarzyszącego w dowolnej klasie i zdefiniować wszystkie pola wewnątrz tego bloku. Ale jest problem z tym podejściem, mówi dokumentacja:
mimo że elementy składowe obiektów towarzyszących wyglądają jak statyczne elementy członkowskie w innych językach, w czasie wykonywania są one nadal elementami składowymi instancji rzeczywistych obiektów i mogą na przykład implementować interfejsy.
Kiedy tworzysz swoje stałe za pomocą obiektu towarzyszącego i widzisz zdekompilowany kod bajtowy , zobaczysz coś takiego jak poniżej,
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;
}
}
Z tego miejsca możesz łatwo zobaczyć, co mówi dokumentacja, mimo że elementy składowe obiektów towarzyszących wyglądają jak statyczne elementy członkowskie w innych językach, w czasie wykonywania nadal są to elementy instancji rzeczywistych obiektów. Wykonuje dodatkową pracę niż jest to wymagane.
Teraz jest inny sposób, w którym nie musimy używać obiektu towarzyszącego, jak poniżej,
object ApiConstants {
val ITEM1: String = "item1"
}
Ponownie, jeśli zobaczysz zdekompilowaną wersję kodu bajtowego powyższego fragmentu, znajdziesz coś takiego,
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";
}
}
Teraz, jeśli widzisz powyższy zdekompilowany kod, tworzy on metodę get dla każdej zmiennej. Ta metoda pobierania nie jest w ogóle wymagana.
Aby pozbyć się tych metod get , powinieneś użyć const przed val, jak poniżej,
object ApiConstants {
const val ITEM1: String = "item1"
}
Teraz, jeśli zobaczysz zdekompilowany kod powyższego fragmentu, będzie on łatwiejszy do odczytania, ponieważ zapewnia najmniejszą konwersję kodu w tle.
public final class ApiConstants {
public static final String ITEM1 = "item1";
public static final ApiConstants INSTANCE;
private ApiConstants() {
}
static {
ApiConstants var0 = new ApiConstants();
INSTANCE = var0;
}
}
Jest to więc najlepszy sposób tworzenia stałych.
public static final
polu w Javie, użyjconst val
w obiekcie towarzyszącym. Jeśli chcesz miećprivate static final
pole i publiczny getter, użyjval
w swoim obiekcie towarzyszącym.