2017-12-04 2 views
0

저는 Kotlin으로 테스트 중이며 테스트 App 프로젝트에서 가져와 사용할 작은 라이브러리를 작성하고 있습니다.내부 클래스 호출 객체 함수를 반환하십시오.

라이브러리 프로젝트에서 클래스를 앱 프로젝트에 표시하고 싶지 않기 때문에 internal으로 표시했지만 라이브러리에 대한 단일 진입 점을 갖고 싶습니다. 코 틀린 object

LIBRARY 

object Library { 
    fun getComponent() = AwesomeComponent() 
} 

internal class AwesomeComponent() { 
    // some implementation 
} 


TEST APP 

class MainActivity : AppCompatActivity() { 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_main) 
     val component = Library.getComponent() 
    } 
} 

문제 아래 그림처럼이 컴파일되지 않는다는 것입니다 때문에 internal 형식을 반환하기 때문에뿐만 아니라 내부로 표시 할 필요는 없지만 이렇게하면 기능을 숨겨 object 라이브러리에서 함수 TestApp에서.

또 다른 옵션은 내가 내려다하고 쉬운 해결책은 거기에서 모든 internal 수정을하지 그래서 TestApp가이 라이브러리 방법을 볼 수 있습니다,하지만 그것은 또한 라이브러리 프로젝트

내부 클래스를 볼 수있을 것입니다 여기 또는 도서관 프로젝트의 패키지와 구조를 다시 계획해야합니까? (그 경우 어떻게해야할지 모르겠다)

답변

3

getComponent() 메서드가 반환하는 구성 요소를 사용하려면 앱 모듈에 공개 API를 게시해야합니다. 라이브러리에 대한 최소한의 정보를 게시하려면 라이브러리에 공개적으로 사용할 수있는 메소드 호출 만 포함하는 인터페이스를 반환하고 클래스가 해당 인터페이스를 구현하도록 할 수 있습니다.

object Library { 
    fun getComponent(): IAwesomeComponent = AwesomeComponent() 
} 

interface IAwesomeComponent { 
    // methods you want to call on the component in the app module 
} 

internal class AwesomeComponent(): IAwesomeComponent { 
    // implementations of the interface methods 
} 
+1

API는 일반적으로 "인터페이스 AwesomeComponent"와 "내부 클래스 AwesomeComponentImpl() : AwesomeComponent"라는 "더 나은"이름을 가져야합니다. –

+0

좋은 지적 - 나는 단지 원래의 코드에 최소한의 변화로 설명하고 싶었다. – zsmb13

관련 문제