Kotlin数据类与开放类?

时间:2019-06-15 06:26:23

标签: java kotlin model realm data-class

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

现在我需要我的kotlin data class支持RealmObject,但根据链接 Kotlin data class of RealmObject,它表示Realm中显然不支持数据类,因此我需要将data class设置为open class

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

1 个答案:

答案 0 :(得分:3)

数据类用于保存值。从Java Bean的角度来看,它们的主要目的是包装一些值。

使Java Bean真正变得丑陋的原因是,理想应该了解您的字段的许多重要方法,例如equals()hashcode()toString() class ...继承自java.lang.Object。因此,它们无济于事。

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

  

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

     
      
  • equals()/ hashCode()对;
  •   
  • toString()的形式为“ User(name = John,age = 42)”;
  •   

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

另一方面,开放类是开放进行扩展的普通类。含义:默认情况下,当您在Kotlin中编写课程时,可以进行扩展。是的,默认情况下防止继承。通过声明一个打开的类,您告诉编译器:“我打算扩展该类”。换句话说:如果您想拥有Child extends Base,那么您的Base类必须在Kotlin中声明为 open

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

长话短说:在您链接到的问题中,系统会告诉您:

  • 您不能使用Realm处理数据
  • 以及此处给出的示例简单地假定,也许您想扩展Person类,因此将其声明为“ open”

我猜:除非您打算创建类的子类,否则只需不用 open关键字即可!编写标准的kotlin,并在打算扩展它们时将其打开。