Kotlin 数据类与公开类?

B.s*_*uti 4 java model realm kotlin data-class

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

现在我需要我kotlin data class的支持,RealmObject但根据RealmObject 的 Kotlin 数据类链接 ,它说 Realm 显然不支持数据类,所以我需要将我的data classas open class.

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

Gho*_*ica 10

数据类旨在保存值。在 Java Bean 意义上,它们的主要目的是包装一些值。

是什么让Java bean的真难看的是,很多重要的方法,比如equals()hashcode()或者toString()理想的应该知道你的类的领域......从java.lang.Object继承。因此他们没有做任何有用的事情。

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

编译器自动从主构造函数中声明的所有属性派生以下成员:

  • equals()/hashCode() 对;
  • toString() 形式为“用户(姓名=约翰,年龄=42)”;

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

一个开放,另一方面班,是一个普通的类,它是开放式的扩展。含义:默认情况下,当你在 Kotlin 中编写一个类时,它不能被扩展。是的,默认情况下禁止继承。通过声明一个类是开放的,你告诉编译器:“我打算扩展这个类”。换句话说:如果你想拥有Child extends Base,那么你的Base类必须在 Kotlin 中声明为open

简而言之:数据类是作为值的容器,可以用作。Open是一个不同的概念,它简单地归结为:可以被某个子类继承(在谈论方法时分别覆盖)。

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

  • 你不能使用 Realm 来处理数据
  • 那里给出的例子只是假设你想扩展那个 Person 类,所以它被声明为“open”

我猜:除非你打算创建你的类的子类,否则你只需不用open 关键字!编写标准的 kotlin,如果要扩展它们,请将它们打开。