Kotlin 정적 메서드 및 변수


83

클래스 인스턴스를 공용 정적 변수에 저장할 수 있기를 원하지만 Kotlin에서이 작업을 수행하는 방법을 알 수 없습니다.

class Foo {

    public static Foo instance;
    public Foo() {
        instance = this;
    }

}

7
kotlinlang.org/docs/reference/classes.html#companion-objects . 그러나 그것은 나에게 끔찍하게 보입니다. 변경 가능한 정적 필드를 사용하고 (이미 나쁜 사례) Foo 인스턴스를 생성 할 때마다 수정하는 이유는 무엇입니까? 당신은 무엇을 성취하려고합니까?
JB Nizet

3
싱글 톤을 만들고 싶다면 kotlinlang.org/docs/reference/…를 확인하세요 .
Miha_x64

답변:


125

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
    }

}

12
의 사용 companion object선언하는 instance당신이 단순히 선언하는 경우 필드는 자동으로 코 틀린 컴파일러가 알아서하는 보일러입니다 Fooobject Foo { ... }
로마 Elizarov

47

싱글 톤 객체를 정의하려는 것 같습니다. Kotlin에서 일류 개념으로 지원됩니다.

object Foo {
  ... 
}

정적 필드와 생성자가있는 모든 상용구 코드는 Kotlin에서 자동으로 처리합니다. 당신은 그 어떤 것도 쓸 필요가 없습니다.

Kotlin 코드에서이 개체의 인스턴스를 간단히 Foo. Java 코드에서이 객체의 인스턴스를로 참조 할 수 있습니다 Foo.INSTANCE. Kotlin 컴파일러가라는 해당 정적 필드를 자동으로 생성하기 때문 INSTANCE입니다.


이것은 훨씬 더 나은 솔루션이지만 Java 클래스 로더로 생성 할 수 있어야했기 때문에 사용 사례에서는 클래스가 필요했습니다.
Caleb Bassham

8

먼저 간단한 클래스를 만든 다음 블록을 만든 후 컴패니언 개체 키워드

예를 들면 :

class Test{

    companion object{

        fun  getValue(): String{

           return "Test String"

        }
    }
}

클래스 이름 도트 함수 이름을 사용하여이 클래스 함수를 호출 할 수 있습니다.

예를 들면 :

// here you will get the function value
Test.getValue() 

1

클래스에 대한 컴패니언 개체를 만들 수 있으며 필드를 원하는 경우 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"
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.