`
sinokaka
  • 浏览: 319985 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于去掉if判断的一些想法

    博客分类:
  • java
 
阅读更多
一个类中有两个私有变量
如X x1; X x2;

有一个方法 doSomthing(X x) {
    if ( x == x1 ) {
        ......
    } else if (x == x2){
       ........
    }
}

这样写当然可以,可是当X的实例越来越多的时候,if会写得越来越长,怎么才可以去除掉这个if判断呢?

一个想法,就是在X中加一个虚函数如叫doX.
X {
    abstract void doX();
}
那么
doSomething(X x) {
   x.doX(); 
}

这样是简洁了一些,实现方法可以有两个,第一就是用很多子类去实现这个X类,第二个是每个X new的时候都要去实现这个方法,这样写起来比较麻烦。
 
第一种实现方法
public abstract class X {

  abstract void doX();
}

public class X1 extends X {
  void doX(){....};
}

public class X2 extends X {
  void doX(){....};
}

public class Test {
  X x1 = new X1();
  X x2 = new X2();

  public void doSomething(X x) {
      x.doX();
  }
}

第二种实现方法
public abstract X {
  abstract void doX();
}

public class Test {
  X x1 = new X() {
     void doX(){
        ....
     }
  };

  X x2 = new X() {
     void doX(){
        ....
     }
  };

   public void doSomething(X x) {
       x.doX();
   }

}


第一种就是生成的子类会越来越多,感觉很难管理。而且不能读取Test类里面的变量。

第二种,Test类看起来结构有些复杂,但是可以读取Test里面的变量。

有没有更好一点的解决方法:(

 
 
可以用内部类实现
 
内部类实现,既可以访问里面的变量,又可以使整体结构好一点,但是整个类就有些复杂了一些:)
 
public abstract class X {

  abstract void doX();
}



public class Test {
  X x1 = new X1();
  X x2 = new X2();

  public void doSomething(X x) {
      x.doX();
  }
 
  private class X1 extends X {
    void doX(){....};
  }

  private class X2 extends X {
    void doX(){....};
  }
}
 
也可以用反射解决
 
在X里面增加一个属性String methodName,methodName对应的就是在Test类里面写的方法的名称,这样呢,最后靠反射就可以了,先得到方法名,然后呢就去调用方法。
 
public class X {
  private String methodName;
  public String getMethodName(){ return methodName};
  pyblic String setMethodName(String methodName){ this.methodName = methodName;}
 
  public X(){}
  public X(String methodName){this.methodName = methodName;}
}

public class Test {
   X x1 = new X("eat");
   X x2 = new X();
   x2.setMethodName("run");

   public void eat() {
     ..... 
   }

   public void run() {
     ..... 
   } 

   public void doSomething(X x) {
      String methodName = x.getMethodName();
      ...........
   }
}
后面的两种解决办法都可以,其实总体上我觉得还是第2种和第3种的解决办法好一些,当然了,第二种和第三种的取决要看是否去读取Test类中的属性了。
因为这两种解决办法都可以动态的增加X实例,而很少去改动其他无关的代码。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics