Konstanten in Kotlin: Hör auf zu raten, fang an, sie richtig zu nutzen
\n\nWenn Sie auch nur eine Woche in Kotlin programmieren, sind Sie bestimmt schon auf die Frage gestoßen: "Wie deklariere ich eine Konstante richtig?" Es scheint einfach – es gibt val, es gibt const val, es gibt companion object. Aber der Teufel steckt, wie immer, im Detail. Und diese Frage auf Stack Overflow hat nicht umsonst tausende Aufrufe.
Lassen Sie uns ein für alle Mal klären, welche Methoden zur Erstellung von Konstanten in Kotlin es gibt, wann man welche verwendet und warum val nicht immer eine Konstante ist. Los geht's!
1. val vs const val: Wo ist der Haken?
\n\nDie häufigste Frage von Anfängern: "Ich habe val geschrieben – ist das eine Konstante?" Die Antwort: Ja und nein.
val ist eine unveränderliche Referenz (read-only). Der Wert wird jedoch zur Laufzeit berechnet. Das ist also keine Compile-Zeit-Konstante.
// Dies ist KEINE Compile-Zeit-Konstante\nval currentTime = System.currentTimeMillis()\n\nconst val ist eine echte Konstante, die zur Compile-Zeit in den Code eingebettet wird (wie static final in Java).
// Und das hier ist eine Konstante\nconst val PI = 3.14159\n\nWichtige Einschränkung: const val kann nur mit primitiven Typen und String verwendet werden. Keine Objekte, Listen oder benutzerdefinierten Klassen.
💡 Goldene Regel: Wenn der Wert zur Compile-Zeit bekannt ist – verwende const val. Wenn er zur Laufzeit berechnet wird – val.
2. Wo deklariert man Konstanten? Die Top-3 Methoden
\n\nMethode 1: Top-level Konstanten (empfohlen)
\n\nDer einfachste und sauberste Weg – deklarieren Sie die Konstante auf der obersten Ebene der Datei. Keine Klassen, keine Objekte – einfach eine Datei mit Konstanten.
\n\n// Constants.kt\nconst val BASE_URL = "https://api.example.com"\nconst val TIMEOUT_SECONDS = 30\nconst val APP_NAME = "MyKotlinApp"\n\nWarum ist das großartig?
\n- \n
- Minimaler Code \n
- Von überall ohne Präfixe zugänglich \n
- Der Compiler bettet die Werte ein \n
- Einfach zu refaktorieren \n
Methode 2: companion object innerhalb einer Klasse
\n\nDer klassische Ansatz aus Java, der in Kotlin übernommen wurde. Verwenden Sie ihn, wenn Konstanten logisch mit einer Klasse verbunden sind.
\n\nclass NetworkClient {\n companion object {\n const val DEFAULT_PORT = 8080\n const val PROTOCOL = "https"\n }\n}\n\n// Verwendung\nval port = NetworkClient.DEFAULT_PORT\n\nNachteil: syntaktisches Rauschen. Vorteil: Konstanten sind an den Kontext gebunden.
\n\nMethode 3: object (Singleton) für Gruppen von Konstanten
\n\nWenn es viele Konstanten gibt und sie sinnvoll gruppiert werden müssen.
\n\nobject AppConstants {\n const val MAX_LOGIN_ATTEMPTS = 5\n const val SESSION_DURATION = 3600L\n const val DATE_FORMAT = "yyyy-MM-dd"\n\n object Urls {\n const val LOGIN = "/auth/login"\n const val LOGOUT = "/auth/logout"\n }\n}\n\n// Verwendung\nAppConstants.Urls.LOGIN\n\n3. Konstanten in Android: Besonderheiten
\n\nWenn Sie für Android entwickeln, gibt es einige zusätzliche Nuancen.
\n\nKonstanten im companion object und @JvmStatic
\n\nDamit eine Konstante aus dem companion object in Java wirklich statisch wird (z.B. für Annotationen), verwenden Sie @JvmStatic:
class MyFragment : Fragment() {\n companion object {\n @JvmStatic\n const val ARG_ID = "id"\n }\n}\n\nKonstanten in Ressourcen
\n\nVergessen Sie nicht die klassische Android-Methode – Ressourcen. Für Strings, Farben, Größen:
\n\n// strings.xml\n<string name="app_name">MyApp</string>\n\n// Im Code\nval appName = getString(R.string.app_name)\n\nDies sind jedoch keine Compile-Zeit-Konstanten.