美文网首页
Kotlin之数据类

Kotlin之数据类

作者: 钦_79f7 | 来源:发表于2019-12-22 10:57 被阅读0次

数据类

数据类是一种非常强大的类,它可以让你避免创建Java中的用于保存状态但又操作非常简单的POJO的模版代码。它们通常只提供了用于访问它们属性的简单的getter和setter。定义一个新的数据类非常简单:

data class Forecast(val date: Date, val temperature: Float, val details: String)

额外的函数

通过数据类,我们可以方便地得到很多有趣的函数,一部分是来自属性,我们之前已经讲过(从编写getter和setter函数):

  • equals(): 它可以比较两个对象的属性来确保他们是相同的。
  • hashCode(): 我们可以得到一个hash值,也是从属性中计算出来的。
  • copy(): 你可以拷贝一个对象,可以根据你的需要去修改里面的属性。我们会在稍后的例子中看到。
  • 一系列可以映射对象到变量中的函数。我也很快就会讲到这个。

复制一个数据类

如果我们使用不可修改的对象,就像我们之前讲过的,假如我们需要修改这个对象状态,必须要创建一个新的一个或者多个属性被修改的实例。这个任务是非常重复且不简洁的。

举个例子,如果我们需要修改Forecast中的temperature(温度),我们可以这么做:

val f1 = Forecast(Date(), 27.5f, "Shiny day")
val f2 = f1.copy(temperature = 30f)

如上,我们拷贝了第一个forecast对象然后只修改了temperature的属性而没有修改这个对象的其它状态。

当你使用Java类时小心“不可修改性”

如果你决定使用不可修改来工作,你需要意识到Java不是根据这种思想来设计的,在某些情况下,我们仍然可以修改这些状态。在上一个例子中,你还是可以访问Date对象,然后改变它的值。有个简单(不安全)的方法是记住所有需要修改状态的对象作为一个规则,然后必要的时候去拷贝一份。

另外一个方法是封装这些类。你可以创建一个ImmutableDate类,它封装了Date并且不允许去修改它们的状态。决定哪种方式取决于你。本书中,我不会对不可修改性太限制,所以我不会去为一些危险的类去创建一个封装类。

映射对象到变量中

映射对象的每一个属性到一个变量中,这个过程就是我们知道的多声明。这就是为什么会有componentX函数被自动创建。使用上面的Forecast类举个例子:

val f1 = Forecast(Date(), 27.5f, "Shiny day")
val (date, temperature, details) = f1

上面这个多声明会被编译成下面的代码:

val date = f1.component1()
val temperature = f1.component2()
val details = f1.component3()

这个特性背后的逻辑是非常强大的,它可以在很多情况下帮助我们简化代码。举个例子,Map类含有一些扩展函数的实现,允许它在迭代时使用key和value:

for ((key, value) in map) {
    Log.d("map", "key:$key, value:$value")
}

相关文章

网友评论

      本文标题:Kotlin之数据类

      本文链接:https://www.haomeiwen.com/subject/wvuinctx.html