[kotlin] Kotlin 정적 메서드 및 변수

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

}


답변

싱글 톤 객체를 정의하려는 것 같습니다. 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"
    }
}


답변