用通俗易懂的例子解释Kotlin数据类

91 阅读2分钟

Kotlindata class 是一个独特的类,用于创建一个class ,其主要目的是在你的源代码中保存数据。

例如,如果你有一个像亚马逊或Shopify这样的电子商务应用程序,你可能有一个Product 类,它包含了你每个产品的数据。

下面是一个简化的例子,你可以在Java中创建一个Product 类:

class Product {
public int id;
public String name;
public int price;
public Product(int id, String name, int price) {
this.id = id;
this.name = name;
this.price = price;
}
}

一旦你有了Product 类,你可以在main() 方法中创建一个新的类的实例,如下所示:

public static void main(String[] args) {
Product myProduct = new Product(1, "Apple", 5);
myProduct.id = 5;
System.out.println(myProduct.id); // 5
}

在Kotlin中,Product 类可以用data class 来简化,如下所示:

data class Product(var id: Int, var name: String, var price: Int)

就这样了。一旦你创建了data class ,你就可以使用该类来创建一个新的实例,如下所示:

var myProduct = Product(1, "Apple", 5)
myProduct.id = 5
println(myProduct.id) // 5

现在你可能想知道Kotlin中的普通classdata class 有什么区别。

Kotlin中的一个data class ,会在你需要的时候生成以下函数供你使用:

  • toString()
  • equals() / 对hashCode()
  • componentN() 函数,以允许解构的data class
  • copy() 函数,以返回 实例的副本。data class

toString() 函数返回构造函数的字符串表示。考虑一下下面的例子:

var myProduct = Product(1, "Apple", 5)
println(myProduct.toString())
// Product(id=1, name=Apple, price=5)

如果没有data classtoString() 函数将返回对象本身而不是内容。

equals()hashCode() 函数与普通的class 相同:

  • equals() 函数允许你比较对象实例的平等性
  • hashCode() 函数返回对象实例的散列号

data class 生成的componentN() 函数允许你对对象实例的值进行去结构化。

考虑一下下面的例子:

var myProduct = Product(1, "Apple", 5)
val (id, name) = myProduct
println(id) // 1
println(name) // Apple

如果没有componentN() 函数,上面突出显示的一行将导致错误。

最后,copy() 函数允许你从data class 复制一个对象实例。

你还可以改变类的属性,如下图所示:

var myProduct = Product(1, "Apple", 5)
val productCopy = myProduct.copy(id = 3, name = "Orange")

println(productCopy.toString()) // Product(id=3, name=Orange, price=5)

这些是你在Kotlin中使用data class 关键字时产生的函数。

一个data class 也有以下要求:

  • 主构造函数需要至少有一个参数。
  • 所有的主构造函数参数需要被标记为valvar
  • 数据类不能是abstract,open,sealed, 或inner

这就是data class 在Kotlin中的作用。

当你需要一个class ,其主要目的是在你的源代码中保存数据时,就可以使用data class