Статические методы и переменные Котлина
Я хочу, чтобы сохранить экземпляр класса в общедоступную статическую переменную, но я не могу понять, как это сделать в Котлине.
class Foo {
public static Foo instance;
public Foo() {
instance = this;
}
}
Ответы
Ответ 1
Ближайшая вещь к статическим полям Java является сопутствующим объектом. Вы можете найти ссылку на документацию для них здесь: https://kotlinlang.org/docs/reference/object-declarations.html#companion-objects
Ваш код в Котлине будет выглядеть примерно так:
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
}
}
Ответ 2
Похоже, вы хотите определить одноэлементный объект. Он поддерживается в Котлине как первоклассная концепция:
object Foo {
...
}
Весь код шаблона со статическим полем и конструктором автоматически берется с помощью Kotlin. Вам не нужно ничего писать.
Из кода Котлина вы можете ссылаться на экземпляр этого объекта просто как Foo
. Из кода Java вы можете ссылаться на экземпляр этого объекта как Foo.INSTANCE
, потому что компилятор Kotlin автоматически создает соответствующее статическое поле с именем INSTANCE
.
Ответ 3
сначала вы создаете простой класс, а затем создадите блок, за которым следует ключевое слово companion
например:
class Test{
companion object{
fun getValue(): String{
return "Test String"
}
}
}
вы можете вызвать эту функцию класса, используя имя имени точки имени точки
например:
// here you will get the function value
Test.getValue()
Ответ 4
Вы можете создать сопутствующий объект для класса, и если вы действительно станете полем, вы можете использовать аннотацию @JvmStatic. Объект Companion имеет доступ к закрытым членам класса, для которого он является компаньоном.
Ниже приведен пример:
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"
}
}