在 Kotlin 中,构造函数内的变量应该是私有的或公共的

SVK*_*SVK 3 android kotlin

我想了解构造函数内的变量在 Kotlin 中应该是私有的还是公共的
访问类构造函数内的修饰符有何意义?

在下面的代码片段中,变量servicequeryprivate
将它们保密有什么用?
它有什么帮助?

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 上阅读了与此领域相关的多个问题和答案,但找不到任何有效的答案。

ami*_*phy 7

需要考虑的事情是构造函数的定义kotlin与 不同java。在您提供的代码片段中,该类有一个主构造函数。根据kotlin 文档

主构造函数是类头的一部分:它位于类名(和可选类型参数)之后。

例如:

class GithubPagingSource(
    service: GithubService,
    query: String
)
Run Code Online (Sandbox Code Playgroud)

还:

请注意,主构造函数的参数可以在初始化块中使用。它们还可以用在类主体中声明的属性初始值设定项中。

那么,如果我们想在函数体内使用它们,该怎么办呢?

在这种情况下,我们必须通过将varval添加到主构造函数的参数来声明类属性:

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)

现在,servicequery正在扮演两个角色:

  • 首先作为构造函数参数
  • 第二个作为类变量

另一方面,封装原则告诉我们要尽可能地限制类变量。这意味着您应该保留它们,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)