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
- Deklaracja object: singletony w Kotlinie
- companion object: elementy podobne do statycznych w Kotlinie
- Obiekty anonimowe i wyrażenia object
- Metody fabrykujące z companion object