Jak jest zalecane tworzenie stałych w Kotlinie? Jaka jest konwencja nazewnictwa? Nie znalazłem tego w dokumentacji.
companion object {
//1
val MY_CONST = "something"
//2
const val MY_CONST = "something"
//3
val myConst = "something"
}
Albo ...?
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.Odpowiedzi:
W Kotlinie, jeśli chcesz stworzyć lokalne stałe, które mają być używane w klasie, możesz to zrobić jak poniżej
A jeśli chcesz utworzyć stałą publiczną w kotlinie, taką jak publiczny statyczny finał w java, możesz utworzyć ją w następujący sposób.
źródło
Constants.kt
lub w jaki sposób?companion object
Myślę, że @piotrpo powinna być zaakceptowanaUnikaj używania obiektów towarzyszących. Za maską tworzone są metody instancji getter i setter, aby pola były dostępne. Wywoływanie metod instancji jest technicznie droższe niż wywoływanie metod statycznych.
Zamiast tego zdefiniuj stałe w
object
.Zalecana praktyka :
i uzyskaj do nich globalny dostęp w następujący sposób:
DbConstants.TABLE_USER_ATTRIBUTE_EMPID
źródło
const val
obiekt towarzyszący może różnić się od aconst val
w zwykłym obiekcie (tj. Jedyną różnicą między Twoimi przykładami wydaje się być to, że pominięto goconst
w przypadku obiektu towarzyszącego - jeśli dodaszconst
, przykłady powinny mieć taką samą wydajność)const val
s, zadeklarowanie acompanion object
jest poprawne.Po pierwsze , konwencja nazewnictwa stałych w Kotlinie jest taka sama jak w javie (np .: MY_CONST_IN_UPPERCASE).
Jak mam to stworzyć?
1. Jako wartość najwyższego poziomu (zalecane)
Musisz tylko umieścić swoją const poza deklaracją klasy.
Dwie możliwości : zadeklaruj swoją stałą w pliku klasy (twoja stała ma wyraźny związek z twoją klasą)
Utwórz dedykowany plik constants.kt, w którym będziesz przechowywać te globalne stałe (tutaj chcesz używać swojej stałej w całym projekcie):
Następnie wystarczy zaimportować go tam, gdzie jest potrzebny:
2. Zadeklaruj go w obiekcie towarzyszącym (lub deklaracji obiektu)
Jest to znacznie mniej czystsze, ponieważ pod maską, podczas generowania kodu bajtowego, tworzony jest bezużyteczny obiekt:
Jeszcze gorzej, jeśli zadeklarujesz to jako wartość zamiast stałej (kompilator wygeneruje bezużyteczny obiekt + bezużyteczną funkcję):
Uwaga :
W kotlinie const może po prostu zawierać typy pierwotne. Jeśli chcesz przekazać do niego funkcję, musisz dodać adnotację @JvmField. W czasie kompilacji zostanie przekształcona jako publiczna statyczna zmienna końcowa. Ale jest wolniejszy niż w przypadku typu prymitywnego. Staraj się tego unikać.
źródło
Wartości znane w czasie kompilacji mogą (i moim zdaniem powinny) być oznaczone jako stałe.
Konwencje nazewnictwa powinny być zgodne z konwencjami języka Java i powinny być odpowiednio widoczne, gdy są używane z kodu Java (jest to trudne do osiągnięcia w przypadku obiektów towarzyszących, ale i tak).
Właściwe deklaracje stałe to:
źródło
Naming conventions should follow Java ones
- czemu?If in doubt, default to the Java Coding Conventions
Nie potrzebujesz klasy, obiektu ani obiektu towarzyszącego do deklarowania stałych w Kotlinie. Możesz po prostu zadeklarować plik zawierający wszystkie stałe (na przykład Constants.kt lub możesz również umieścić je w dowolnym istniejącym pliku Kotlin) i bezpośrednio zadeklarować stałe w pliku. Stałe znane w czasie kompilacji muszą być oznaczone
const
.Tak więc w tym przypadku powinno to być:
const val MY_CONST = "something"
a następnie możesz zaimportować stałą za pomocą:
import package_name.MY_CONST
Możesz odnieść się do tego linku
źródło
Jeśli umieścisz swój
const val valName = valValue
przed nazwą klasy, w ten sposób utworzy się plikpublic static final YourClass.Kt
które będą miałypublic static final
wartości.Kotlin :
Dekompilacja Java:
źródło
masz dwie możliwości: możesz użyć
const
słowa kluczowego lub użyć,@JvmField
co sprawia, że jest to statyczna stała java.Jeśli użyjesz
@JvmField
adnotacji, to po jej kompilacji stała zostanie wstawiona tak, jak byś ją nazwał w java.Tak jak byś to nazwał w java, kompilator zastąpi to za Ciebie, gdy wywołasz stałą towarzyszącą w kodzie.
Jeśli jednak użyjesz słowa kluczowego const, wartość stałej zostanie wstawiona. Przez inline mam na myśli faktyczną wartość używaną po kompilacji.
więc podsumowując, oto co kompilator zrobi za Ciebie:
źródło
Deklaracja wartości statycznej i stałej Kotlin i metody
}
Uzyskaj dostęp do wartości w dowolnym miejscu
źródło
Podobnie jak
val
zmienne zdefiniowane za pomocąconst
słowa kluczowego są niezmienne. Różnica polega na tym, żeconst
jest używany dla zmiennych znanych w czasie kompilacji.Deklarowanie zmiennej
const
przypomina użyciestatic
słowa kluczowego w Javie.Zobaczmy, jak zadeklarować zmienną const w Kotlinie:
Analogiczny kod napisany w Javie to:
Dodanie do powyższych odpowiedzi -
Pola statyczne
Zwykle te pola są prywatne, ale można je ujawnić w jeden z następujących sposobów:
@JvmField
adnotacja;lateinit
modyfikator;const
modyfikator.Więcej szczegółów tutaj - https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#instance-fields
źródło
Coś, o czym nie ma mowy w żadnej z odpowiedzi, to koszt użytkowania
companion objects
. Jak możesz przeczytać tutaj , obiekty towarzyszące są w rzeczywistości obiektami i tworzenie ich pochłania zasoby. Ponadto może być konieczne przejście przez więcej niż jedną funkcję pobierającą za każdym razem, gdy używasz stałej. Jeśli wszystko, czego potrzebujesz, to kilka prymitywnych stałych, prawdopodobnie lepiej będzie po prostu użyć,val
aby uzyskać lepszą wydajność i uniknąćcompanion object
.TL; DR; artykułu:
Użycie obiektu towarzyszącego faktycznie zmienia ten kod
W tym kodzie:
Więc staraj się ich unikać.
źródło
stałe lokalne:
Stałe globalne:
dostęp do MyConstants.NAME
źródło
Istnieje kilka sposobów definiowania stałych w Kotlinie,
Korzystanie z obiektu towarzyszącego
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:
Kiedy tworzysz swoje stałe za pomocą obiektu towarzyszącego i widzisz zdekompilowany kod bajtowy , zobaczysz coś takiego jak poniżej,
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,
Ponownie, jeśli zobaczysz zdekompilowaną wersję kodu bajtowego powyższego fragmentu, znajdziesz coś takiego,
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,
Teraz, jeśli zobaczysz zdekompilowany kod powyższego fragmentu, będzie on łatwiejszy do odczytania, ponieważ zapewnia najmniejszą konwersję kodu w tle.
Jest to więc najlepszy sposób tworzenia stałych.
źródło
Dla prymitywów i ciągów:
W innych przypadkach:
Przykład:
źródło