0Pricing
Kotlin Academy · Lekcja

companion object: elementy podobne do statycznych w Kotlinie

Dodawaj companion object do klas, aby symulować metody i stałe statyczne.

companion object: elementy podobne do statycznych w Kotlinie to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Brak static, ale jest companion object

Kotlin nie ma słowa kluczowego static. Zamiast tego companion object zadeklarowany wewnątrz klasy udostępnia elementy na poziomie klasy (podobne do statycznych).

Deklarowanie companion object

Umieść companion object wewnątrz klasy. Jego elementy można wywoływać jako ClassName.member.

class MathUtils {
    companion object {
        fun square(x: Int) = x * x
    }
}
fun main() {
    println(MathUtils.square(5)) // 25
}

Stałe w companion object

Stałe zazwyczaj umieszcza się w companion object, często używając const val dla literałów znanych w czasie kompilacji.

class HttpClient {
    companion object {
        const val DEFAULT_TIMEOUT = 5000
        const val USER_AGENT = "MyApp/1.0"
    }
}
fun main() {
    println(HttpClient.DEFAULT_TIMEOUT)
    println(HttpClient.USER_AGENT)
}

Nazwany companion object

Można nadać nazwę companion object. Działają zarówno ClassName.member, jak i ClassName.CompanionName.member.

class Database {
    companion object Factory {
        fun create() = Database()
    }
}
fun main() {
    val db1 = Database.create()       // works
    val db2 = Database.Factory.create() // also works
    println("$db1 / $db2")
}

Wzorzec metody fabrykującej

Użyj obiektu towarzyszącego do tworzenia instancji z walidacją lub alternatywną logiką konstrukcji.

class User private constructor(val name: String, val email: String) {
    companion object {
        fun create(name: String, email: String): User {
            require(email.contains("@")) { "invalid email" }
            return User(name, email)
        }
    }
}
fun main() {
    val u = User.create("Ada", "ada@example.com")
    println("${u.name} <${u.email}>")
}

Implementowanie interfejsów

Sam obiekt towarzyszący może implementować interfejsy — jest to przydatne przy łączeniu go z klasami, które wymagają kontraktu przypominającego statyczny.

interface Loadable<T> { fun load(): T }
class Config(val data: String) {
    companion object : Loadable<Config> {
        override fun load() = Config("loaded data")
    }
}
fun main() {
    println(Config.load().data)
}

@JvmStatic w integracji z Javą

Oznacz elementy obiektu towarzyszącego adnotacją @JvmStatic, aby udostępnić je wywołującym z Javy jako prawdziwe metody statyczne.

class Util {
    companion object {
        @JvmStatic
        fun greet(name: String) = "Hello, $name!"
    }
}
fun main() {
    println(Util.greet("Kotlin"))
    // In Java: Util.greet("Java")
}

Uzyskiwanie dostępu do samego obiektu towarzyszącego

ClassName.Companion bezpośrednio odwołuje się do obiektu towarzyszącego. Użyj tego zapisu, gdy przekazujesz go jako argument.

class Counter {
    companion object {
        fun greet() = "hi from companion"
    }
}
fun main() {
    val ref = Counter.Companion
    println(ref.greet())
}

Obiekt towarzyszący a elementy najwyższego poziomu

W przypadku funkcji narzędziowych, które nie należą do żadnej klasy, preferuj funkcje najwyższego poziomu zamiast klasy zawierającej tylko obiekt towarzyszący.

// File-level — usually cleaner:
fun greet(name: String) = "Hi, $name!"
// Versus:
class Greeter { companion object { fun greet(n: String) = "Hi, $n!" } }
fun main() {
    println(greet("Ada"))
    println(Greeter.greet("Ada"))
}

Jeden obiekt towarzyszący na klasę

Klasa może mieć najwyżej jeden obiekt towarzyszący. W razie potrzeby dodatkowy współdzielony stan można przechowywać w zwykłych obiektach zagnieżdżonych.

class Service {
    companion object {
        val version = "1.0"
    }
    object InternalHelper { fun log() = println("internal") }
}
fun main() {
    println(Service.version)
    Service.InternalHelper.log()
}

Funkcje rozszerzające obiektu towarzyszącego

Możesz rozszerzyć obiekt towarzyszący spoza klasy, dodając pomocnicze funkcje udające metody statyczne.

class Lib {
    companion object
}
fun Lib.Companion.helper() = "added later"
fun main() {
    println(Lib.helper())
}

Szybkie sprawdzenie

Jaki jest Kotlinowy odpowiednik elementów Java oznaczonych jako static?

Podsumowanie

Kotlin nie ma elementów static. Używaj obiektu towarzyszącego dla elementów klasowych — stałych, fabryk i implementacji interfejsów. Dodaj adnotację @JvmStatic na potrzeby integracji z Javą albo rozszerz obiekt za pomocą funkcji rozszerzających, aby uzyskać pomocnicze funkcje udające metody statyczne.

Często zadawane pytania

Czy lekcja „companion object: elementy podobne do statycznych w Kotlinie” jest bezpłatna?

Tak — pełny tekst „companion object: elementy podobne do statycznych w Kotlinie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „companion object: elementy podobne do statycznych w Kotlinie”?

Dodawaj companion object do klas, aby symulować metody i stałe statyczne. Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?

Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „companion object: elementy podobne do statycznych w Kotlinie”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?

Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Deklaracja object: singletony w Kotlinie
  2. companion object: elementy podobne do statycznych w Kotlinie
  3. Obiekty anonimowe i wyrażenia object
  4. Metody fabrykujące z companion object
← Powrót do Kotlin Academy