一个类中有两个私有变量
如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实例,而很少去改动其他无关的代码。
分享到:
相关推荐
去除Excel公式冗余判断.rar,许多用户在创建能够屏蔽错误值的公式时,千篇一律地将公式写成=IF(ISERROR(原公式)=TRUE,
oracle中如何判断一个字符串是否含有汉字.pdforacle中如何判断一个字符串是否含有汉字.pdforacle中如何判断一个字符串是否含有汉字.pdf
用算法去除数组中重复的数字(不使用查重函数)通过嵌套for循环和if条件判断实现,用算法去除数组中重复的数字(不使用查重函数)通过嵌套for循环和if条件判断实现
1、判断一个整数m是否是素数,只需把 m 被 2 ~ m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数。 2、m 不必被 2 ~ m-1 之间的每一个整数去除,只需被 2~√m 之间的每一个整数去除就可以了。如果 ...
有水印感觉总是很不爽,为此下面收集了一些去除水印的一些方法,希望对大家有那么一点点帮助。 一、使用仿制图章工具去除文字 这是比较常用的方法,具体的操作是,选取仿制图章工具,按住Alt键,在无文字区域点击...
如果是下面的 jQuery 代码判断一个对象是否存在,是不能用的。 if($("#id")){ //... }else{ //... } 因为 $(“#id”) 不管对象是否存在都会返回 object 。 正确使用判断对象是否存在应该用: if($("#id")....
检测小型金属零件表面划痕,判断非缺陷部分并给予去除
判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 c语言程序设计实现。
增加一些去除不稳定数据的采集方式 更改Arduino的HX711库;增加一些去除不稳定数据的采集方式 更改Arduino的HX711库;增加一些去除不稳定数据的采集方式 更改Arduino的HX711库;增加一些去除不稳定数据的采集方式 ...
判断101-200之间有多少个素数,并输出所有素数。 判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 */
本文实例讲述了C#判断字符串是否存在字母及字符串中字符的替换的方法。分享给大家供大家参考。具体实现方法如下: 首先要添加对命名空间“using System.Text.RegularExpressions;”的引用 下面以一个字符串为例: ...
highcharts去掉水印的方法
不破解跳过unity splash 界面,去掉烦人的LOGO 不破解跳过unity splash 界面,去掉烦人的LOGO 不破解跳过unity splash 界面,去掉烦人的LOGO 不破解跳过unity splash 界面,去掉烦人的LOGO 不破解跳过unity splash ...
(text文档保存,占空间小)mfc个人整理的一些万能代码,大小端转换,去除逗号,去掉空格,去掉0x等等,值得保留,如果你也初学代码,把这些代码都搞明白吧,这些既是基础,又是必备
tekla.structures图纸 水印去除 17.0 以前版本 可用于去除水印
去除svn工具
SQl去掉HTML标签函数 彻底防止SQL注入
去掉源码行号 去除行号 从网页上复制源代码有的带行号,使用该工具可以去除行号
拷贝的关键字经常含有很多空格、换行、tab键之类的空白字符,该工具自动去除空白字符,进行搜索。使用方法:在输入款粘贴后,点百度搜索即可。
主要介绍了如何优雅的替换掉Java代码中的if else,帮助大家优化自己的Java代码,提高可读性与简洁性,感兴趣的朋友可以了解下