为什么使用数据类作为嵌套类

时间:2019-09-15 16:59:00

标签: kotlin

我遇到了以下代码:

sealed class PointOf(val location: LatLng) {
    data class Interest(val point: DbHotelPointOfInterest) : PointOf(point.location!!)
    data class Hotel(val hotel: DbHotel) : PointOf(hotel.location!!)
}

我习惯于将数据类用作顶级类,而不是嵌套类。使用数据类作为嵌套类的有效理由是什么?

1 个答案:

答案 0 :(得分:2)

给定的class是否为data class是根据您是否想要data class提供的“免费”默认功能(等于/ hashCode,副本等)。

sealed class是为其定义所有可能的子类并“为人所知”的子类,从而允许编译器执行各种不错的操作,例如验证when语句是否详尽无遗。

这两个概念彼此完全分开存在。您可以自由地为密封类的子类做任何想做的事情,这包括决定使它们成为数据类。

因此,分析您的示例:

sealed class的{​​{1}}选择将允许您编写以下代码(假设PointOfpointOf密封类的有效实例):

PointOf

您不需要提供when (pointOf) { is Interest -> handlePointOfInterest(pointOf) is Hotel -> handleHotel(pointOf) } 子句,因为编译器知道else语句是穷举性的。而且,如果您确实添加了第三个when子类,则不必担心会忘记此when语句,因为编译器会立即知道PointOf不再是穷举性的,并且会使您失败。构建。

when的{​​{1}}选择将允许您编写以下代码(假设data classHotel类的有效实例):

dbHotel

如果DbHotel是简单的非数据val hotelPoint1 = PointOf.Hotel(dbHotel) val hotelPoint2 = PointOf.Hotel(dbHotel) if (hotelPoint1 == hotelPoint2) { // will succeed, because data classes generate an equals() implementation } ,则由于没有定义的PointOf.Hotel方法,该class检查将失败,因此您将检查参照相等性。