我想在运行时检查类型,但我不想在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。
如果有更好的方法,请告诉我。
答案 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();
}