一个类中有两个私有变量
如X x1; X x2;
有一个方法 doSomthing(X x) {
if ( x == x1 ) {
......
} else if (x == x2){
........
}
}
如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();
}
那么
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();
}
}
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();
}
}
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();
}
}
|
可以用内部类实现
内部类实现,既可以访问里面的变量,又可以使整体结构好一点,但是整个类就有些复杂了一些:)
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();
}
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(){....};
}
}
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};
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();
...........
}
}
}
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实例,而很少去改动其他无关的代码。