如何避免使用instanceof?

时间:2017-11-02 18:15:30

标签: java instanceof

我们如何避免使用instanceof运算符来编写干净的代码 比如说: 如果一个对象是Type1做某事,但如果它是Type2,那么做其他事情。

if(obj instanceof T1){
    doSomething()
 }else(obj instanceof T2){
    doOtherThing()
 }

3 个答案:

答案 0 :(得分:2)

通常,您使用一系列带有强制转换的instanceof来调用类中存在但不存在于其他类中的特定方法:

if(obj instanceof T1){
    ((T1)obj) doSomething();
}
else(obj instanceof T2){
    ((T2)obj) doOtherThing();
}

为避免这种情况,如果您可以修改这些类,T1T2应该是公共基类的子类,并且应该在基类中定义调用的方法。
通过这种方式,每个子类都可以实现它,你可以写:

obj.doSomething();

如果你不能修改这些类,你总是可以引入一个Adapter类来包装它们,以提供一种调用这些方法的常用方法。

<强>适配器

public interface Adapter{
    void process();
}

<强> AdapterForT1

public class AdapterForT1 implements MyAdapter{

    private T1 adapted;
    public AdapterForT1(T1 adapted){
      this.adapted = adapted;
    } 

    public void process(){
       adapted.doSomething();
    }

}

<强> AdapterForT2

public class AdapterForT2 implements MyAdapter{

    private T2 adapted;
    public AdapterForT2(T2 adapted){
      this.adapted = adapted;
    } 

    public void process(){
       adapted.doOtherThing();
    }

}

你可以这样使用它们:

MyAdapter adapter = new AdapterForT1(obj);
...
adapter.process();

或:

MyAdapter adapter = new AdapterForT2(obj);
...
adapter.process();

答案 1 :(得分:1)

你需要在这里使用方法覆盖,然后从不同类的不同实例中调用相同的函数,这些实例将执行不同的指令集,这些指令按照在各个类中实现

例如,你有一个类T,然后类T1和类T2都扩展了类T,所有三个类都实现了executeTask函数

所以,

T t1 = new T1();
T t2 = new T2();

// this will execute function overridden in T1
t1.executeTask();

// this will execute function overridden in T2
t2.executeTask();

答案 2 :(得分:1)

创建一个String^ s = String::Format("{0:N2}", temperature/204.6); ,两个类都实现。接口是每个实现类必须遵守的合同。

通过这种方式,您可以确保此类的每个实例都具有从该接口实现的所有已定义方法。

例如:

interface

然后你的两个班级:

public interface CustomExecutable {
    void execute();
}

在您的主程序中,您可以执行以下操作:

public class T1 implements CustomExecutable {
    @Override
    public void execute() {
        // Do t1 logic
    }
}

public class T2 implements CustomExecutable {
    @Override
    public void execute() {
        // Do t2 logic
    }
}
不再需要

CustomExecutable ce = new T1(); ce.execute(); // Does t1 logic ce = new T2(); ce.execute(); // Does t2 logic ,因为每种类型都有自己instanceof代码的方式。

相关问题