【发布时间】:2015-05-18 13:54:45
【问题描述】:
我想在运行时检查类型,但我不想在 Java 中使用 instanceOf() 或 getClass() 方法。
因此我做了以下事情:
我创建了一个枚举
public enum CarType{
SEDAN,
SUV
}
我创建了一个界面
public interface Car{
public CarType getCarType();
}
然后我写了两个实现Car的类。
public class Sedan implements Car{
public CarType getCarType(){
return CarType.SEDAN
}
}
现在另一个类是
public class Suv implements Car{
public CarType getCarType(){
return CarType.Suv
}
}
然后我在其他类的方法中使用这些类作为
class CarUI{
public void updateTheUIConsideringCarType(CarType type) {
switch(type){
case SUV:
//UI to update when car type is SUV
case SEDAN:
//UI to update when car type is SEDAN
break;
default:
break;
}
}
}
我想问一下,如果我用这种方式是不是很好,还是和使用instanceOf()一样,我想坚持OOP。
如果有更好的方法请告诉我。
【问题讨论】:
-
这比依赖继承稍微好一点(继承是开放式的,而枚举具有固定数量的元素)但仍然不理想。确切的解决方案将取决于许多因素。
-
最好的方法是在
Car接口中声明updateTheUI方法并在每个类中单独实现。我自己会认为枚举switch比instanceof更干净,但两者都不是很好。一种可能的方法是使CarUI成为一个接口并为每种类型实现它。 -
@Bubletan 我不同意。您建议将模型与 UI 相关活动直接耦合。但是这样的事情应该是独立的。所以你的建议是一种解决方法,但没有什么能使它成为“最好的方法”。
-
@Bubletan 这是处理它的一种方法。您还可以创建一个
CarUIUpdater接口并将单独的实现传递给每辆汽车,以避免汽车代码与UI 更新代码混合。还有很多其他选项,但问题不够详细,无法选择。 -
@Jägermeister 是的,再想一想,如果 UI 相关的东西在
Car里面可能会有点乱。但仍将其拆分为多个类可以使其更有条理。
标签: java oop inheritance enums polymorphism