Joh*_*nak 5 java oop hibernate jpa
我将JPA继承与JOIN策略(JPA2 / Hibernate)结合使用。我有一个具有共享字段(日期,时间,地点等)的抽象常规事件实体,以及它的子对象,例如OutdoorEvent,ClassicalMusicEvent等,每种类型都有特定的字段。我搜索所有事件,得到一个List<Event>显示的事件。但是,每种事件类型的处理都不同,因此我需要弄清楚每种Event对象的事件类型。现在是问题所在。我想出了两种解决方案。首先,instanceof关键字:
if (event instanceof OutdoorEvent) {
...
} else if (event instanceof OtherKindOfEvent) {
...
} etc.
Run Code Online (Sandbox Code Playgroud)
其次,我将一个临时枚举字段添加到Event实体,并在每个子类型的构造函数中设置此字段。然后我可以做:
if (event.getType() == EventType.OutdoorEvent) {
...
} else if (event.getType() == EventType.OtherKindOfEvent) {
...
} etc.
Run Code Online (Sandbox Code Playgroud)
哪种解决方案更好,或者是更多的OOP?还有其他解决方案吗?
这是一个很好的问题,因为最佳的 OOP 解决方案是使用多态性。在您的抽象事件类上添加一个抽象“处理”方法,然后在您的子类中实现所需的处理。然后你就可以直接调用process()而不必关心它的子类是什么类型。
但是,您可能希望使您的事件(即数据)类与逻辑分离,因此您可能最终会在某个地方做instanceof类似枚举的事情。
我没有偏好,一个可能比另一个更快,我可能会选择枚举而不是实例来提高速度(热衷于听到是否有人对此有见解)。
如果您确实使用枚举在事件示例中,您应该使用开关而不是 if..else。