if语句中的多个instanceof

时间:2014-10-16 13:02:00

标签: java if-statement instanceof

我有一个if语句,有多个instanceof检查。例如:

if (object instanceof Object1) {
    // do something
} else if (object instanceof Object2) {
    // to something else
} else if (object instanceof Object2) {
    // and something else
} ...

解决这个if-else-query的更优雅方法是什么?

4 个答案:

答案 0 :(得分:4)

OOP中的最佳实践是将逻辑放在object本身并使其实现接口:

界面:

public interface MyLogic{
    public void doLogic();
}

第一个对象:

public class Object1 implements MyLogic{
  public void doLogic(){// logic 1 here}
}

第二个对象:

public class Object2 implements MyLogic{
  public void doLogic(){// logic 2 here}
}

现在只需将您的逻辑移动到对象本身,而只是使用

所有if语句
object.doLogic(); // make sure object is from type MyLogic, if not, cast it

答案 1 :(得分:1)

这似乎是多态的,因此您可以创建一个接口并为每个Object实现它。

interface ObjectToBeImplemented{
 method();
}

class Object1 implements ObjectToBeImplemented{ 
 @Override
 method(){...}
}
class Object2 implements ObjectToBeImplemented{ 
 @Override
 method(){...}
}

class Object3 implements ObjectToBeImplemented{ 
 @Override
 method(){...}
}

答案 2 :(得分:0)

这是接口的典型用法。将接口视为定义实例的类型。因此,您知道某个Type的所有实例都可以执行特定任务。那时,您并不真正关心对象的具体类,您只知道它具有可供您使用的特定接口。

示例:

public interface Worker {
     public void doWork();
}

public class Object1 implements Worker {
    public void doWork() {
      // work for this specific object
    }
}

public class Object2 implements Worker {
    public void doWork() {
      // work for this specific object
    }
}

public class Object3 implements Worker {
    public void doWork() {
      // work for this specific object
    }
}

然后你的if语句将替换为

obj.doWork();

答案 3 :(得分:0)

这感觉错过了多态的机会。

这是一堆类与其超类/接口共享相同方法签名的地方,因此调用它的代码不需要知道它是哪种类型。

没有多态:

Employee employee = ...;
if(employee instanceof Doctor) {
     salary = calcDoctorSalary(...);
} else if(employee instanceof Nurse) {
     salary = calcNurseSalary(...);
}

使用多态:

Employee employee = ...;
salary = employee.calcSalary(...);

魔法进入了子类。 calcSalary()在超类中是抽象的,或在接口中是方法签名:

public abstract class Employee {
     public abstract int calcSalary(...);
}

......或......

public interface Employee {
    public int calcSalary(...);
}

然后依赖于类型的逻辑进入子类:

public class Nurse implements Employee {
    @Override
    public int calcSalary(...) {
         // code specific to nurses goes here.
    }
}

您是否可以通过经验学习扩展课程或实现界面。通常当一个人没有从界面开始时,人们会后来后悔。