Esistono alcuni modi per definire le costanti in Kotlin,
Utilizzo dell'oggetto associato
companion object {
const val ITEM1 = "item1"
const val ITEM2 = "item2"
}
puoi usare sopra il blocco oggetto compagno all'interno di qualsiasi classe e definire tutti i tuoi campi all'interno di questo blocco stesso. Ma c'è un problema con questo approccio, dice la documentazione,
anche se i membri degli oggetti companion sembrano membri statici in altre lingue, in fase di esecuzione sono comunque membri di istanza di oggetti reali e possono, ad esempio, implementare interfacce.
Quando crei le tue costanti usando l'oggetto associato e vedi il bytecode decompilato , avrai qualcosa di simile al di sotto,
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;
}
}
Da qui puoi facilmente vedere cosa diceva la documentazione, anche se i membri degli oggetti associati sembrano membri statici in altre lingue, in fase di esecuzione sono ancora membri di istanza di oggetti reali. Sta facendo un lavoro extra del necessario.
Ora arriva un altro modo, in cui non abbiamo bisogno di usare l'oggetto compagno come sotto,
object ApiConstants {
val ITEM1: String = "item1"
}
Ancora una volta se vedi la versione decompilata del codice byte dello snippet sopra, troverai qualcosa del genere,
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";
}
}
Ora se vedi il codice decompilato sopra, sta creando il metodo get per ogni variabile. Questo metodo get non è affatto richiesto.
Per sbarazzarsi di questi metodi get , dovresti usare const prima di val come sotto,
object ApiConstants {
const val ITEM1: String = "item1"
}
Ora se vedi il codice decompilato dello snippet sopra, troverai più facile da leggere poiché fa la conversione in background minima per il tuo codice.
public final class ApiConstants {
public static final String ITEM1 = "item1";
public static final ApiConstants INSTANCE;
private ApiConstants() {
}
static {
ApiConstants var0 = new ApiConstants();
INSTANCE = var0;
}
}
Quindi questo è il modo migliore per creare costanti.
public static finalcampo in Java, utilizzareconst valnell'oggetto compagno. Se si desidera unprivate static finalcampo e un getter pubblico, utilizzarevalnell'oggetto compagno.