我将 JPA 继承与 JOIN 策略 (JPA2/Hibernate) 结合使用。我有一个带有共享字段(日期、时间、地点等)的抽象通用事件实体,以及它的子实体,比如说 OutdoorEvent、ClassicalMusicEvent 等,每种类型都有特定的字段。我搜索所有事件,得到 List<Event>
我展示的。虽然每个事件类型的处理是不同的,所以我需要弄清楚每个事件对象的事件类型。现在问题来了。我想出了两个解决方案。首先,instanceof
关键词:
if (event instanceof OutdoorEvent) {
...
} else if (event instanceof OtherKindOfEvent) {
...
} etc.
其次,我将一个 transient 枚举字段添加到事件实体,并在每个子类型的构造函数中设置该字段。然后我可以这样做:
if (event.getType() == EventType.OutdoorEvent) {
...
} else if (event.getType() == EventType.OtherKindOfEvent) {
...
} etc.
哪个解决方案更好,或者更面向对象?还有其他解决方案吗?
最佳答案
这是一个很好的问题,因为最佳的 OOP 解决方案是使用多态性。在您的抽象事件类上添加一个抽象的“处理”方法,然后在您的子类中实现所需的处理。然后你可以只调用 process()
而不必关心它是什么类型的子类。
但是,您可能希望让您的事件(即数据)类与逻辑分离,因此您可能最终会在某个地方执行 instanceof
或类似您的枚举的操作。
我没有偏好哪个,有可能一个比另一个更快,我可能会使用枚举而不是 instanceof 来提高速度(很想知道是否有人对此有洞察力)。
如果您确实使用枚举在您的事件示例中,您应该使用开关而不是 if..else。
关于java - JPA、继承和instanceof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6303662/