首页 文章

Kotlin:使用Object vs Class进行范围设计

提问于
浏览
2

我有一些数据类,这很短,所以我将它们组合在一个文件中 .

我可以在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)
}

他们对我看起来都一样 . 有什么不同,如果有一个首选的方法来确定我的数据类的范围?

2 回答

  • 0

    我建议不要使用类来确定其他类的范围 . 正如托德在他的回答中所解释的那样,你可以使用密封的类,它提供exhaustive when checks的实际好处 . 如果您不需要此功能,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

    另一种选择是使所有数据类成为密封的 Model 类的子类 . 这将为您提供在一个地方定义它们的好处,因为Kotlin对密封类强制执行 . 此外,让类型系统了解 Model 类型的所有实例在 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)))
    

相关问题