やりたいこと
- interface定義と、その実装をなるべくキレイに切り分けたい
インターフェース定義用モジュール
interface AuthService {
fun login(id: String, password: String)
}
実装用モジュール
internal class AuthServiceImpl {
override fun login(id: String, password: String) {
}
}
コレの問題点
- AuthServiceImplがinternalなので、他のモジュールから見えない
- けれどAuthServiceImplをモジュールの外に開放したくない(後で入替えたりとかやりやすいように)
解決
- interface側にcompanion objectを入れておく
interface定義を修正
interface AuthService {
fun login(id: String, password: String)
companion object
}
実装用モジュールにExtensionも定義
internal class AuthServiceImpl {
override fun login(id: String, password: String) {
}
}
fun AuthService.Companion.newInstance() {
return AuthServiceImpl()
}
- これでinternal classを開放せずにインスタンスを作れる