Kotlin'de sabitleri tanımlamanın birkaç yolu vardır,
Tamamlayıcı nesneyi kullanma
companion object {
const val ITEM1 = "item1"
const val ITEM2 = "item2"
}
herhangi bir sınıf içinde yukarıdaki tamamlayıcı nesne bloğunu kullanabilir ve bu bloğun içindeki tüm alanlarınızı tanımlayabilirsiniz. Ancak bu yaklaşımda bir sorun var, belgeler diyor ki,
tamamlayıcı nesnelerin üyeleri diğer dillerdeki statik üyeler gibi görünse de, çalışma zamanında bunlar gerçek nesnelerin örnek üyeleridir ve örneğin arabirimleri uygulayabilir.
Sabitinizi tamamlayıcı nesneyi kullanarak oluşturduğunuzda ve kodu çözülen bayt kodunu gördüğünüzde, aşağıdaki gibi bir şey görürsünüz ,
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;
}
}
Burada , tamamlayıcı nesnelerin üyeleri diğer dillerdeki statik üyeler gibi görünse de, çalışma zamanında hala gerçek nesnelerin örnek üyeleri olan belgelerin söylediklerini kolayca görebilirsiniz .
Şimdi, aşağıdaki gibi tamamlayıcı nesneyi kullanmamız gerekmediği başka bir yol geliyor ,
object ApiConstants {
val ITEM1: String = "item1"
}
Yine, yukarıdaki snippet'in bayt kodunun decompiled sürümünü görürseniz, böyle bir şey bulacaksınız,
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";
}
}
Şimdi yukarıdaki kod çözülmüş kodu görürseniz, her değişken için get yöntemi yaratıyor. Bu get yöntemi hiç gerekli değildir.
Bu olsun yöntemlerinin kurtulmak için kullanmanız gereken, const önce val aşağıda gibi,
object ApiConstants {
const val ITEM1: String = "item1"
}
Şimdi yukarıdaki snippet'in ayrıştırılmış kodunu görürseniz, kodunuz için en az arka plan dönüşümünü yaptığı için okumayı daha kolay bulacaksınız.
public final class ApiConstants {
public static final String ITEM1 = "item1";
public static final ApiConstants INSTANCE;
private ApiConstants() {
}
static {
ApiConstants var0 = new ApiConstants();
INSTANCE = var0;
}
}
Bu sabitleri yaratmanın en iyi yoludur.
public static final
Java'daki bir alana karşılık gelen bir şey istiyorsanızconst val
, tamamlayıcı nesnenizde kullanın . Birprivate static final
alan ve halka açık bir alıcı istiyorsanızval
, tamamlayıcı nesnenizde kullanın .