【问题标题】:Kotlin Data class v/s open class?Kotlin 数据课与公开课?
【发布时间】:2019-06-15 06:26:23
【问题描述】:
当我将我的 java 项目转换为 kotlin 项目时,我来了
了解 kotlin 中的数据类(Java 模型类的替换)。
现在我要求我的 kotlin data class 支持 RealmObject 但根据链接
Kotlin data class of RealmObject,它表示 Realm 显然不支持数据类,所以我需要将我的 data class 设为 open class。
所以基本上,我想知道这两个术语之间的区别。
【问题讨论】:
标签:
java
kotlin
model
realm
data-class
【解决方案1】:
Data 类旨在保存值。在 Java Bean 的意义上,它们的主要目的是包装一些值。
让 Java bean 真正难看的是许多重要的方法,例如 equals()、hashcode() 或 toString(),理想情况下应该知道你的类的字段......是继承的来自 java.lang.Object。因此他们没有做任何有用的事情。
当您在 Kotlin 中声明 data class 时,Kotlin 编译器只是为所有这些方法添加一个合理的实现。见kotlin-lang:
编译器会自动从所有
在主构造函数中声明的属性:
- equals()/hashCode() 对;
- toString() 形式为“User(name=John, age=42)”;
换句话说:当那个 User 类是一个数据类,并且当你有 两个
用User(name=John, age=42) 声明的用户对象,那么这两个对象将相等,因为生成 equals() 方法将比较这些数据类对象中的名称和年龄。
另一方面,Open 类是open 用于扩展的普通类。含义:默认情况下,当你在 Kotlin 中编写一个类时,它可以不被扩展。是的,默认情况下阻止继承。通过声明一个类是开放的,你告诉编译器:“我打算扩展这个类”。换句话说:如果你想拥有Child extends Base,那么你的Base 类必须在Kotlin 中声明为open。
简而言之:数据类是作为值的容器,可以这样使用。 开放是一个不同的概念,它简单地归结为:可以被某个子类继承(在谈论方法时分别被覆盖)。
长话短说:在你链接到的那个问题中,你被告知:
- 您不能使用 Realm 处理 数据 类
- 那里给出的示例只是假设您可能想要扩展该 Person 类,因此将其声明为 `open`
我猜:除非您打算创建类的子类,否则您只需不使用 open 关键字!编写标准 kotlin,如果打算扩展它们,请将它们打开。
【解决方案2】:
Kotlin 数据类:
Kotlin 语言提供的众多便捷功能之一是 data 关键字。当我们使用 data 关键字声明一个类时,编译器会实现 equals(Object o)、hashCode() 和 toString() 方法,从而省去了我们手动执行的麻烦。
Kotlin 公开课:
在 Kotlin 中,默认情况下所有类都是 final 的,即默认情况下它们不能被继承。在 Java 中,您必须明确地使您的类成为 final。所以,要让一个类可以被其他类继承,你必须用 open 关键字标记它,否则你会得到一个错误,说“类型是最终的,所以不能被继承”。
【解决方案3】:
Kotlin 数据类:
Kotlin 语言提供的众多便捷功能之一是 data 关键字。当我们用 data 关键字声明一个类时,编译器会实现 equals(Object o)、hashCode() 和 toString() 方法,从而使我们免于手动操作的麻烦。
Kotlin 公开课:
在 Kotlin 中,默认情况下所有类都是 final,即默认情况下它们不能继承。在 Java 中,您必须明确地使您的类成为 final。所以,要让一个类继承到其他类,你必须用 open 关键字标记它,否则你会得到一个错误,说“type is final so can't be继承”。