gpt4 book ai didi

java - JPA、继承和instanceof

转载 作者:搜寻专家 更新时间:2023-10-31 19:41:31 25 4
gpt4 key购买 nike

我将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com