我有一个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的更优雅方法是什么?
答案 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.
}
}
您是否可以通过经验学习扩展课程或实现界面。通常当一个人没有从界面开始时,人们会后来后悔。