Kotlin 数据 class v/s 打开 class?

Kotlin Data class v/s open class?

当我将我的 java 项目转换为 kotlin 项目时,我来了 了解 kotlin 中的数据 类(替换 Java 模型 类)。

现在我的 kotlin data class 需要支持 RealmObject 但根据 link ,它说 Realm 显然不支持数据 类,所以我需要将我的 data class 设置为 open class

基本上,我想知道这两个术语之间的区别。

Data classes 用于保存值。在 Java Bean 意义上,它们的主要目的是环绕一些值集。

让 Java bean 真正丑陋的是许多重要的方法,例如 equals()hashcode()toString() 理想情况下 应该知道你的 class 的字段......继承自 java.lang.Object。因此他们没有做任何有用的事情。

当您在 Kotlin 中声明 data class 时,Kotlin 编译器只是 添加 所有这些方法的合理实现。参见 kotlin-lang

The compiler automatically derives the following members from all properties declared in the primary constructor:

  • equals()/hashCode() pair;
  • toString() of the form "User(name=John, age=42)";

换句话说:当那个用户class是一个数据class,并且当你有两个 使用 User(name=John, age=42) 声明的用户对象,那么这两个对象将相等,因为 generated equals() 方法将比较这些数据中的姓名和年龄 class 个对象。

另一方面,Open class 是一个普通的 class,即 open 用于扩展.含义:默认情况下,当你在 Kotlin 中写一个 class 时,它可以 而不是 被扩展。是的,默认情况下 阻止 继承。通过将 class 声明为打开,您告诉编译器:"I intend to extend this class"。换句话说:如果你想要 Child extends Base,那么你的 Base class 必须在 Kotlin 中声明 open

简而言之:数据 classes 的意思是 的容器,可以用作那个。 Open是一个不同的概念,它简单归结为:可以被某些子class.

继承(在谈论方法时分别被覆盖)

长话短说:在您链接到的那个问题中,您被告知:

  • 你不能使用 Realm 来处理 data classes
  • 那里给出的例子只是假设也许你想扩展那个人class,所以它被声明为`open``

我想:除非您打算创建 class 的子 class,否则您只需 不使用 关键字即可!编写标准的 kotlin,如果要扩展它们,请将它们打开。

Kotlin 数据 Class:

Kotlin 语言提供的众多便捷功能之一是 data 关键字。当我们用 data 关键字声明一个 class 时,编译器会实现 equals(Object o)、hashCode() 和 toString() 方法,从而使我们免于麻烦手动完成。

科特林开放Class:

在 Kotlin 中,所有 classes 默认情况下都是 final 即它们默认情况下不能 inherited。在 Java 中,您必须明确地使 class 最终化。因此,要 使 class 可继承 给其他 class,您必须用 open 关键字标记它,否则你会收到一条错误消息“type is final so can't be inherited”。

Kotlin 数据 Class:

Kotlin 语言提供的众多便捷功能之一是数据关键字。当我们用 data 关键字声明一个 class 时,编译器会实现 equals(Object o)、hashCode() 和 toString() 方法,从而使我们免于手动执行的麻烦。

科特林公开赛Class:

在 Kotlin 中,所有 classes 默认都是 final 的,即默认情况下它们不能被继承。在 Java 中,您必须明确地使 class 最终化。所以,要让一个 class 可以被其他 class 继承,你必须用 open 关键字标记它,否则你会得到一个错误,说“type is final so can't be inherited”。