本文概述
数据类是一个简单的类, 用于保存数据/状态并包含标准功能。 data关键字用于将一个类声明为数据类。
data class User(val name: String, val age: Int)
声明一个数据类必须至少包含一个带有属性参数(val或var)的主构造函数。
数据类内部包含以下功能:
- equals():布尔值
- hashCode():整数
- toString():字符串
- 与属性对应的component()函数
- 复制()
由于数据类内部存在上述功能, 因此该数据类消除了样板代码。
Java数据类和Kotlin数据类之间的压缩
如果要使用数据类在Java中创建用户条目, 则需要大量样板代码。
import java.util.Objects;
public class User {
private String name;
private int id;
private String email;
public User(String name, int id, String email) {
this.name = name;
this.id = id;
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public intgetId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
return getId() == user.getId() &&
Objects.equals(getName(), user.getName()) &&
Objects.equals(getEmail(), user.getEmail());
}
@Override
public inthashCode() {
return Objects.hash(getName(), getId(), getEmail());
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", id=" + id +
", email='" + email + '\'' +
'}';
}
}
使用User类的对象调用上述Java数据类的构造函数
class MyClass{
public static void main(String agrs[]){
User u = new User("Ashu", 101, "mymail@mail.com");
System.out.println(u);
}
}
输出:
User{name='Ashu', id=101, email='mymail@mail.com'}
上面的Java数据类代码用Kotlin数据代码单行重写为
data class User(var name: String, var id: Int, var email: String)
使用User类的对象调用上述Kotlin数据类的构造函数
fun main(agrs: Array<String>) {
val u = User("Ashu", 101, "mymail@mail.com")
println(u)
}
输出:
User(name=Ashu, id=101, email=mymail@mail.com)
数据类别的要求
为了创建数据类, 我们需要满足以下要求:
- 包含具有至少一个参数的主构造函数。
- 主构造函数的参数标记为val或var。
- 数据类不能是抽象的, 内部的, 开放的或密封的。
- 在1.1之前, 数据类只能实现接口。之后, 数据类可以扩展其他类。
Kotlin数据类toString()方法
Kotlin数据类仅关注数据, 而不关注代码实现。
让我们看一个没有数据类的简单程序。在此类中, 我们尝试使用其对象打印Product类的引用。
class Product(varitem: String, var price: Int)
fun main(agrs: Array<String>) {
val p = Product("laptop", 25000)
println(p)
}
在打印产品类的引用时, 它将显示带有产品类名称的hashCode()。它不打印数据。
输出:
Product@266474c2
使用数据类重写上述程序, 并打印产品类的引用并显示对象的数据。发生这种情况是因为数据类内部包含toString(), 该toString()显示object的字符串表示形式。
data class Product(varitem: String, var price: Int)
fun main(agrs: Array<String>) {
val p = Product("laptop", 25000)
println(p)
}
输出:
Product(name=laptop, price=25000)
Kotlin数据classequals()和hashCode()
equal()方法用于检查其他对象是否“等于”当前对象。在两个或多个hashCode()之间进行比较时, 如果hashCode()相等, 则equals()方法返回true, 否则返回false。
例如, 让我们看一个示例, 其中一个普通类将具有相同数据的相同类Product的两个引用进行比较。
class Product(varitem: String, var price: Int)
fun main(agrs: Array<String>) {
val p1 = Product("laptop", 25000)
val p2 = Product("laptop", 25000)
println(p1==p2)
println(p1.equals(p2))
}
在上述程序中, 参考p1和参考p2具有不同的参考。由于p1和p2中的参考值不同, 进行比较显示为false。
输出:
false
false
使用数据类重写以上程序, 打印产品类的引用并显示对象的数据。
hashCode()方法返回对象的哈希码。如果两个对象相等, 则hashCode()会产生相同的整数结果。
data class Product(varitem: String, var price: Int)
fun main(agrs: Array<String>) {
val p1 = Product("laptop", 25000)
val p2 = Product("laptop", 25000)
println(p1==p2)
println(p1.equals(p2))
}
输出:
true
true
Kotlin数据类copy()方法
数据类提供了copy()方法, 该方法用于创建对象的副本(或冒号)。使用copy()方法, 可以更改对象的某些或全部属性。
例如:
data class Product(var item: String, var price: Int)
fun main(agrs: Array<String>) {
val p1 = Product("laptop", 25000)
println("p1 object contain data : $p1")
val p2 = p1.copy()
println("p2 copied object contains default data of p1: $p2")
val p3 = p1.copy(price = 20000)
println("p3 contain altered data of p1 : $p3")
}
输出:
p1 object contain data : Product(item=laptop, price=25000)
p2 copied object contains default data of p1: Product(item=laptop, price=25000)
p3 contain altered data of p1 : Product(item=laptop, price=20000)
数据类中的默认参数和命名参数
我们还可以在数据类的主构造函数中分配默认参数。如果需要, 可以在以后的程序中更改这些默认值。
例如:
data class Product(var item: String = "laptop", var price: Int = 25000)
fun main(agrs: Array<String>) {
val p1 = Product(price = 20000)
println(p1)
}
输出:
Product(item=laptop, price=20000)
评论前必须登录!
注册