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

时间:2017-06-10 13:23:14

标签: 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)
}

他们对我看起来都一样。什么是不同的,以及在确定数据类的范围方面是否有首选方式?

2 个答案:

答案 0 :(得分:2)

我建议不要使用类来确定其他类的范围。正如Todd在他的回答中所解释的那样,你可以使用密封的类,它提供exhaustive when checks的实际好处。如果您不需要此功能,Kotlin有一个内置的作用域机制 - 包:

      sendTextMessage(recipientId, `Howdy ${snapshot.child("userDetails/firstName").val()}! I’m Marco :)`)
      sendSenderAction(recipientId, "typing_on")
      setTimeout(()=>sendTextMessage(recipientId, "Botting Marco."),1000)
      sendSenderAction(recipientId, "typing_on")
      setTimeout(()=>sendTextMessage(recipientId, "Let me show you some of my recent work. This is the first portfolio bot ever. (afaik) :p"),5000)
      sendSenderAction(recipientId, "typing_on")
      setTimeout(()=>sendTextMessage(recipientId, "How many minutes do you have?"),7000)
      userRef.update({stage:1, class:1, awaiting: true})
  

我可以在Kotlin文件中定义它们,但是它更喜欢它是类/对象中的范围,因此该文件不仅仅是一个文件,而是在类/对象下更好地分组

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

答案 1 :(得分:0)

另一种选择是使所有数据类成为密封的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)))