Я хочу мати можливість зберегти екземпляр класу у загальнодоступній статичній змінній, але я не можу зрозуміти, як це зробити в Kotlin.
class Foo {
public static Foo instance;
public Foo() {
instance = this;
}
}
Я хочу мати можливість зберегти екземпляр класу у загальнодоступній статичній змінній, але я не можу зрозуміти, як це зробити в Kotlin.
class Foo {
public static Foo instance;
public Foo() {
instance = this;
}
}
Відповіді:
Найближчим до статичних полів Java є об’єкт-супутник. Ви можете знайти посилання на документацію для них тут: https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects
Ваш код у Kotlin буде виглядати приблизно так:
class Foo {
companion object {
lateinit var instance: Foo
}
init {
instance = this
}
}
Якщо ви хочете, щоб ваші поля / методи були виставлені статичними для абонентів Java, ви можете застосувати @JvmStatic
анотацію:
class Foo {
companion object {
@JvmStatic lateinit var instance: Foo
}
init {
instance = this
}
}
companion object
для оголошення instance
поля - це шаблон, про який піклується компілятор Котліна автоматично, якщо ви просто заявляєте Foo
якobject Foo { ... }
Схоже, ви хочете визначити одномісний об'єкт. Це підтримується в Kotlin як першокласна концепція:
object Foo {
...
}
Весь шаблонний код зі статичним полем і конструктором автоматично переглядається Kotlin. Вам не потрібно писати нічого з цього.
З коду Kotlin ви можете посилатися на екземпляр цього об'єкта просто як Foo
. З коду Java ви можете звернутися до екземпляра цього об'єкта як Foo.INSTANCE
, оскільки компілятор Kotlin автоматично створює відповідне статичне поле з іменем INSTANCE
.
спочатку ви створюєте простий клас, після чого створюєте блок, за яким слідує ключове слово об’єкт-супутник
наприклад:
class Test{
companion object{
fun getValue(): String{
return "Test String"
}
}
}
Ви можете викликати цю функцію класу, використовуючи ім'я класу крапка ім'я функції
наприклад:
// here you will get the function value
Test.getValue()
Ви можете створити супутній об’єкт для класу, і якщо ви хочете, щоб це поле було static
ви можете використовувати анотацію @JvmStatic. Об'єкт-супутник має доступ до приватних членів класу, для якого він є супутником.
Дивіться нижче приклад:
class User {
private lateinit var name: String
override fun toString() = name
companion object {
@JvmStatic
val instance by lazy {
User().apply { name = "jtonic" }
}
}
}
class CompanionTest {
@Test
fun `test companion object`() {
User.instance.toString() shouldBe "jtonic"
}
}