运行时类型识别

时间:2015-05-18 13:54:45

标签: java oop inheritance enums polymorphism

我想在运行时检查类型,但我不想在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。

如果有更好的方法,请告诉我。

2 个答案:

答案 0 :(得分:3)

使用这种机制当然是个好主意 - 它会在以后节省我们的许多工作。

您还可以采取进一步措施(如果适用于您的代码) - 让enum进行用户界面绘制。

public interface CanDraw {

    public void draw();
}

public enum CarType implements CanDraw {

    SEDAN {

                @Override
                public void draw() {
                    // Do your UI drawing here.
                }

            },
    SUV {

                @Override
                public void draw() {
                    // Do your UI drawing here.
                }

            };
}

public void updateTheUIConsideringCarType(CarType type) {
    type.draw();
}

如评论中所述,这有时会导致您的UI代码泄漏到您的模型代码中。通常可以通过从UI返回功能来避免这种情况 - 例如:

public interface CanDraw {

    public void draw();
}

// In your UI.
public enum CarDrawingPolicy implements CanDraw {

    SMALL {

                @Override
                public void draw() {
                    // Do your UI drawing here.
                }

            },
    BIG {

                @Override
                public void draw() {
                    // Do your UI drawing here.
                }

            };
}

public interface HasDrawingPolicy {

    public CarDrawingPolicy getDrawingPolicy();
}

// In your Model
public enum CarType implements HasDrawingPolicy {

    SEDAN {

                @Override
                public CarDrawingPolicy getDrawingPolicy() {
                    return CarDrawingPolicy.SMALL;
                }

            },
    SUV {

                @Override
                public CarDrawingPolicy getDrawingPolicy() {
                    return CarDrawingPolicy.BIG;
                }

            };
}

public void updateTheUIConsideringCarType(CarType type) {
    type.getDrawingPolicy().draw();
}

答案 1 :(得分:0)

这种方法的问题在于Car的任何新实现都需要更改多个文件,这些文件必须保持彼此同步。换句话说,这些类是紧密耦合的。 无论更新中的逻辑是什么,应该在每个汽车实现中封装.UIConsideringCarType。

所以你的汽车界面可能是这样的:

public interface Car{
    public Object getUiStuff();
}

那么你的updateTheUIConsideringCarType将被定义为:

public void updateTheUIConsideringCarType(Car car) {
    car.getUiStuff();
}