首页 > 解决方案 > 如何避免使用 Instanceof 运算符?

问题描述

我有一个类,即 A.java 和两个子类 B 和 C,它们扩展了类 A。假设类的结构如下。

  class A implements Base{
   @Override
   void m1(){
      //some code
    }
  }

  Class B extend A{
   ABC m2(){
   }
  }

 Class C extend A{
    XYZ m3(){
      }
    }

现在我正在多个地方实施以下方式。每次使用 instanceOf 运算符,都很忙。如何避免使用 instanceOf 运算符。

Class Test {
public void getData(Base aData){
    A a = aData;
   if(a instance of B){
   ABC aBC = ((B)a).m2();
   abc.someData();
   }
   else
   XYZ xYZ = ((C)a).m3();
   xYZ.someOtherData();
 }
}

标签: javaandroid

解决方案


按照您问题中当前的代码:

if (a instanceof B) {
    ABC aBC = ((B)a).m2();
    abc.someData();
} else {
    XYZ xYZ = ((C)a).m3();
    xYZ.someOtherData();
}

您可以避免在基类instanceof中使用抽象方法,如下所示:A

abstract class A implements Base {
    ...
    abstract void m();
}

或者在你的界面中是这样的:

interface Base {
    ...
    void m();
}

你像这样实现:

class B extends A {
    ABC m2() {
        // whatever you have here
    }

    @Override
    void m() {
        ABC abc = m2();
        abc.someData();
    }
}

class C extends A {
    XYZ m3() {
        // whatever you have here
    }

    @Override
    void m() {
        XYZ xYZ = m3();
        xYZ.someOtherData();
    }
}

然后你可以instanceof

a.m();

推荐阅读