companion object in Kotlin – der saubere Weg zu „statischen" Membern
Kotlin kennt kein `static` wie Java. Für Konstanten, Fabrik-Methoden und Co. gibt es das companion object. Ich zeige, wofür ich es nutze – und den Factory-Trick, mit dem der Konstruktor privat bleibt.
Wer von Java kommt, sucht in Kotlin vergeblich nach static. Was du auf Klassen-Ebene brauchst – Konstanten, Fabrik-Methoden, Helfer – lebt in einem companion object: einem einzelnen Objekt, das zur Klasse gehört.
Konstanten und Helfer
class Kreis(val radius: Double) {
companion object {
const val PI = 3.14159
fun einheit() = Kreis(1.0)
}
}
val u = 2 * Kreis.PI // über den Klassennamen erreichbar
val eins = Kreis.einheit()Kreis.PI und Kreis.einheit() rufst du ohne Instanz auf – genau das, was static in Java macht. const val ist eine echte Compile-Zeit-Konstante (nur für primitive Typen und String).
Der Factory-Trick: privater Konstruktor
Oft will ich kontrollieren, wie ein Objekt entsteht (Validierung, Caching). Dann mache ich den Konstruktor privat und biete eine Fabrik-Methode im companion an:
class User private constructor(val name: String) {
companion object {
fun ausRohdaten(raw: String): User? {
val name = raw.trim()
return if (name.isNotEmpty()) User(name) else null
}
}
}
val u = User.ausRohdaten(" Mia ") // User oder null
// User("x") // ❌ geht nicht: Konstruktor ist privatSo gibt es nur einen definierten Weg, ein User zu bauen – inklusive der Regel „leerer Name → null".
Kleiner Aha-Moment
Das companion object ist ein echtes Objekt. Es kann Interfaces implementieren und hat sogar einen Namen (Companion, wenn du keinen vergibst). Für Interop mit Java kannst du Member mit @JvmStatic annotieren, damit sie dort wie klassisch-statische Methoden erscheinen.
Faustregel: Was nicht zu einer einzelnen Instanz gehört, sondern zur Klasse, gehört ins companion object.
Wenn du eine Android-App in Kotlin planst und sauberen, gut strukturierten Code willst, setze ich das für dich um – meld dich über bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
Nach mehreren Kriterien sortieren – sortedWith, compareBy und thenBy
Erst nach Priorität, dann nach Datum, und die ohne Termin ganz nach hinten: Solche Sortierungen werden mit einem handgeschriebenen Comparator schnell unleserlich. Kotlin hat dafür eine Baukastenschreibweise.
Room-Migrationen – das Schema ändern, ohne Nutzerdaten zu verlieren
Eine neue Spalte in der Entity, und beim nächsten Start ist der Spielstand weg – weil fallbackToDestructiveMigration die Datenbank einfach löscht. So machst du es richtig, inklusive Test.
Fehler in Coroutinen – coroutineScope, supervisorScope und wer wen mitreißt
Eine von fünf parallelen Abfragen scheitert – und plötzlich sind alle abgebrochen. Das ist kein Bug, sondern strukturierte Nebenläufigkeit. Wer den Unterschied zwischen coroutineScope und supervisorScope kennt, steuert das bewusst.