2016-07-14 7 views
82

"동반자 개체"의 의미는 무엇입니까? 지금까지 필자는 필요할 때 Java의 static을 대신 사용했습니다.왜 Kotlin에서 Java 정적 필드를 대체하는 것으로 "컴패니언 개체"를 사용합니까?

  • 은 왜 "동반자"라고합니다 :

    나는 혼동입니까?

  • 여러 개의 정적 속성을 만들려면이 그룹을 companion object 블록으로 그룹화해야합니까?
  • 즉시 나는 종종

쓰기, 클래스에 범위가 싱글 인스턴스를 만들려면 :

companion object { 
    val singleton by lazy { ... } 
} 

그 일의 unidiomatic 방법처럼 보인다. 더 좋은 방법이 뭔가요?

답변

64
  • "동반자 객체"의 의도 된 의미는 무엇입니까? "동반자"라고 불리는 이유는 무엇입니까?코 틀린가 단독 상태 접속 특성 및 기능을 설명하기위한 자체 concept of objects 있고, 자바 클래스 static 파트 우아 단독으로 표현 될 수 있기 때문에

    먼저 코 틀린는 static 부재 자바 개념을 사용하지 : 클래스 이름으로 호출 할 수있는 싱글 톤 객체입니다. 따라서 명명 : 그것은 클래스와 함께 제공되는 객체입니다.

    그 이름은 class object and default object 이었지만,보다 명확하고 Scala companion objects과 일치하는 it got renamed to companion object이었습니다.

    이름 지정 이외에도 Java static 구성원보다 강력합니다. 클래스 및 인터페이스를 확장 할 수 있으며 다른 개체처럼 참조하고 전달할 수 있습니다.

  • 정적 속성을 여러 개 만들려면 블록 번호 companion object 블록 안에 그룹화해야합니까?

    네, 그건 관용적 인 방법입니다. 또는 당신이 할 수있는 그 의미로도 그룹화 비 동반자 제품 :

    class MyClass { 
        object IO { 
         fun makeSomethingWithIO() { /* ... */ } 
        } 
    
        object Factory { 
         fun createSomething() { /* ... */ } 
        } 
    } 
    
  • 즉시, 나는 종종 수행의 unidiomatic 방법처럼 보인다 /*...*/ 쓰기 클래스에 범위가 싱글 인스턴스를 만들려면 그것. 더 좋은 방법이 뭔가요?

    각각의 경우에 필요한 항목에 따라 다릅니다. 귀하의 코드는 처음 호출 할 때 초기화되는 클래스에 바인딩 된 상태를 저장하는 데 적합합니다. 또한 단지 자바 정적과 같은 속성이 사용 첫 클래스를 초기화 할 lazy { ... } delegation을 제거 할 수 있습니다

    object Foo { 
        val something by lazy { ... } 
    } 
    

    :

    당신이 그것을 필요로하지 않는 경우

    는 객체 선언을 사용하는 클래스에 연결하기 이니셜 라이저

    initializing singleton state의 유용한 방법을 찾을 수도 있습니다.

+0

좋은 삽화적인 예입니다. – Trein

13

"컴패니언"이라고하는 이유는 무엇입니까?

이 개체는 인스턴스의 동반자입니다. IIRC 긴 토론이 여기에 있었다 : upcoming-change-class-objects-rethought

이 그 여러 정적 속성을 만들 뜻, 나는 동반자 개체 블록 내부 그룹화 여기에있다?

예. 모든 "정적"속성/메소드는이 컴패니언 안에 배치해야합니다.

즉시 클래스에 범위가 싱글 인스턴스를 만들려면, 나는 종종 당신은 즉시 싱글 인스턴스를 생성하지 않는

물품. 처음으로 singleton에 액세스 할 때 생성됩니다.

이것은 일종의 일을하는 것처럼 보입니다. 더 좋은 방법이 뭔가요?

싱글 톤을 정의하려면 object Singleton { }으로 지정하십시오. 참조 : Object Declarations 당신은 Singleton의 인스턴스를 만들 필요가 없습니다, 그냥 Singleton.doWork()

같이 사용할 그냥 코 틀린는 코드를 구성 할 다른 물건을 제공 명심하십시오. 예를 들어 간단한 정적 함수에 대한 대안이 있습니다. 대신 최상위 함수를 사용할 수 있습니다.

0

"컴패니언"이라고하는 이유는 무엇입니까?

클래스 내부 객체 선언은 동반자 키워드로 표시 할 수 있습니다 :

val instance = MyClass.create() 
: 동반자 개체의

class MyClass { 
    companion object Factory { 
     fun create(): MyClass = MyClass() 
    } 
} 

회원이 규정 자로 단순히 클래스 이름을 사용하여 호출 할 수 있습니다

'컴패니언'없이 '객체'만 사용하는 경우 다음과 같이해야합니다.

val instance = MyClass.Factory.create() 

제 생각에 '동반자'는이 객체가 outter 클래스와 함께 있다는 것을 의미합니다.