我想了解构造函数内的变量在 Kotlin 中应该是私有的还是公共的。
访问类构造函数内的修饰符有何意义?
在下面的代码片段中,变量service和query是private。
将它们保密有什么用?
它有什么帮助?
class GithubPagingSource(
private val service: GithubService,
private val query: String
) : PagingSource<Int, Repo>() {
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Repo> {
TODO("Not yet implemented")
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我在 Stack Overflow 上阅读了与此领域相关的多个问题和答案,但找不到任何有效的答案。
需要考虑的事情是构造函数的定义kotlin
与 不同java
。在您提供的代码片段中,该类有一个主构造函数。根据kotlin 文档:
主构造函数是类头的一部分:它位于类名(和可选类型参数)之后。
例如:
class GithubPagingSource(
service: GithubService,
query: String
)
Run Code Online (Sandbox Code Playgroud)
还:
请注意,主构造函数的参数可以在初始化块中使用。它们还可以用在类主体中声明的属性初始值设定项中。
那么,如果我们想在函数体内使用它们,该怎么办呢?
在这种情况下,我们必须通过将var
或val
添加到主构造函数的参数来声明类属性:
class GithubPagingSource(
val service: GithubService,
val query: String
) : PagingSource<Int, Repo>() {
init {
println("$query") // query is accessible here
}
override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Repo> {
println("$query") // query also is accessible here
}
}
Run Code Online (Sandbox Code Playgroud)
现在,service
和query
正在扮演两个角色:
另一方面,封装原则告诉我们要尽可能地限制类变量。这意味着您应该保留它们,private
除非需要从外部可见。
class GithubPagingSource(
private val service: GithubService,
private val query: String
) : PagingSource<Int, Repo>() {
...
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我们有对该类的实例的引用:
val githubPagingSource = ...
val query = githubPagingSource.query // is not accessible here
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2778 次 |
最近记录: |