Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin:使用对象与类的作用域_Kotlin - Fatal编程技术网

Kotlin:使用对象与类的作用域

Kotlin:使用对象与类的作用域,kotlin,Kotlin,我有几个数据类,也就是说很短,所以我将它们组合在一个文件中 我可以按原样在Kotlin文件中定义它们,但更希望它是类/对象中的作用域,因此该文件不仅仅是一个文件,而是在类/对象下进行更好的分组 我可以 object Model { data class Result(val query: Query) data class Query(val searchinfo: SearchInfo) data class SearchInfo(val totalhits: Int)

我有几个数据类,也就是说很短,所以我将它们组合在一个文件中

我可以按原样在Kotlin文件中定义它们,但更希望它是类/对象中的作用域,因此该文件不仅仅是一个文件,而是在类/对象下进行更好的分组

我可以

object Model {
    data class Result(val query: Query)
    data class Query(val searchinfo: SearchInfo)
    data class SearchInfo(val totalhits: Int)
}
我也可以

class Model {
    data class Result(val query: Query)
    data class Query(val searchinfo: SearchInfo)
    data class SearchInfo(val totalhits: Int)
}

在我看来他们两个都一样。有什么不同吗?如果有一种更好的方法来确定我的数据类的范围?

另一种选择是将所有数据类都设置为密封的
模型的子类。这将使您能够在一个地方定义它们,因为Kotlin对密封的类强制执行这一点。另外,让类型系统知道类型
模型
的所有实例在
表达式中也很有帮助,因为这样就不需要您放置
else->

sealed class Model
data class Result(val query: Query) : Model()
data class Query(val searchinfo: SearchInfo) : Model()
data class SearchInfo(val totalhits: Int) : Model() 
您可以直接使用它们:

val r = Result(Query(SearchInfo(3))
不要将它们包装在另一个
对象
中,您必须这样引用它们:

val r = Model.Result(Model.Query(Model.SearchInfo(3)))

我建议不要使用类来限定其他类的范围。正如Todd在他的回答中所解释的,您可以使用密封类,这些类提供了。如果您不需要此功能,Kotlin有一个用于作用域包的内置机制:

package org.company.model

data class Result(val query: Query)
data class Query(val searchinfo: SearchInfo)
data class SearchInfo(val totalhits: Int)
我可以按原样在Kotlin文件中定义它们,但更希望它是类/对象中的作用域,因此该文件不仅仅是一个文件,而是在类/对象下进行更好的分组


包含多个顶级元素的文件没有问题。这是一个有用的语言功能,正是在这种情况下使用的。

嗨,基里尔,谢谢你的回答。我同意,把它作为顶级没有问题。然而,我使用的是改型2和proguard,proguard会混淆它,导致编译错误,因此我将其范围限定为,我可以按照保留类,而不需要单独保留它们。如果您将模型类放在子包中,您可以指示proguard仅保留该子包。