我遇到了以下代码:
sealed class PointOf(val location: LatLng) {
data class Interest(val point: DbHotelPointOfInterest) : PointOf(point.location!!)
data class Hotel(val hotel: DbHotel) : PointOf(hotel.location!!)
}
我习惯于将数据类用作顶级类,而不是嵌套类。使用数据类作为嵌套类的有效理由是什么?
答案 0 :(得分:2)
给定的class
是否为data class
是根据您是否想要data class
提供的“免费”默认功能(等于/ hashCode,副本等)。
sealed class
是为其定义所有可能的子类并“为人所知”的子类,从而允许编译器执行各种不错的操作,例如验证when
语句是否详尽无遗。
这两个概念彼此完全分开存在。您可以自由地为密封类的子类做任何想做的事情,这包括决定使它们成为数据类。
因此,分析您的示例:
sealed class
的{{1}}选择将允许您编写以下代码(假设PointOf
是pointOf
密封类的有效实例):
PointOf
您不需要提供when (pointOf) {
is Interest -> handlePointOfInterest(pointOf)
is Hotel -> handleHotel(pointOf)
}
子句,因为编译器知道else
语句是穷举性的。而且,如果您确实添加了第三个when
子类,则不必担心会忘记此when
语句,因为编译器会立即知道PointOf
不再是穷举性的,并且会使您失败。构建。
when
的{{1}}选择将允许您编写以下代码(假设data class
是Hotel
类的有效实例):
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
检查将失败,因此您将检查参照相等性。