Return内部class调用对象函数
Return internal class calling object function
我正在使用 Kotlin 进行测试,我正在编写一个小型库以供测试 App 项目导入和使用。
在库项目中,我将我的 类 标记为 internal
,因为我不希望它们对 App 项目可见,但我希望有一个入口点库,为此我正在使用如下所示的 Kotlin 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()
}
}
问题是这无法编译,因为库 object
returns 中的函数是 internal
类型,因此也需要标记为内部函数,但是这样做所以将从 TestApp 隐藏该功能。
另一种选择是根本没有 internal
修饰符,这样 TestApp 就可以看到库方法,但它也可以看到库项目中的 类
是否有我在这里忽略的简单解决方案,或者是否需要重新规划库项目的包和结构? (不知道在那种情况下该怎么做)
您必须为应用程序模块发布某种 public API 才能使用 getComponent()
方法 return 的组件。如果您想发布关于您的库的最少信息,您可以让它 return 一个仅包含对库的 public 可用方法调用的接口,并让您的 class 实现该接口:
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
}
我正在使用 Kotlin 进行测试,我正在编写一个小型库以供测试 App 项目导入和使用。
在库项目中,我将我的 类 标记为 internal
,因为我不希望它们对 App 项目可见,但我希望有一个入口点库,为此我正在使用如下所示的 Kotlin 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()
}
}
问题是这无法编译,因为库 object
returns 中的函数是 internal
类型,因此也需要标记为内部函数,但是这样做所以将从 TestApp 隐藏该功能。
另一种选择是根本没有 internal
修饰符,这样 TestApp 就可以看到库方法,但它也可以看到库项目中的 类
是否有我在这里忽略的简单解决方案,或者是否需要重新规划库项目的包和结构? (不知道在那种情况下该怎么做)
您必须为应用程序模块发布某种 public API 才能使用 getComponent()
方法 return 的组件。如果您想发布关于您的库的最少信息,您可以让它 return 一个仅包含对库的 public 可用方法调用的接口,并让您的 class 实现该接口:
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
}