클래스 인스턴스를 공용 정적 변수에 저장할 수 있기를 원하지만 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"
}
}