Kotlin:使用对象与类的范围

我有几个数据类,就是简短的,所以我把它们放在一个文件中。

我可以将它们定义在一个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有一个内置的作用域包的机制:

 package org.company.model data class Result(val query: Query) data class Query(val searchinfo: SearchInfo) data class SearchInfo(val totalhits: Int) 

我可以将它们定义在一个Kotlin文件中,但是它更喜欢它是一个类/对象的范围,所以这个文件不仅仅是一个文件,而且是在类/对象之下,以便更好的分组

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

另一个选择是使所有的数据类成为一个密封的Model类的一个子类。 这将给你在一个地方定义所有的好处,因为Kotlin强制密封的类。 此外,使types系统知道typesModel所有实例在expression式when也是有用的,因为那样它就不会要求你放一个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)) 

而不是把它们包装在另一个classobject ,你必须像这样引用它们:

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