以下代码是项目、产品中真实存在代码。小编是写过垃圾代码的程序猿,小编也是看过别人写垃圾代码的程序猿。为了写好代码也是要拼的,废话不多说看代码吧!
1. 类A判断是否归属类B的判断
private void getFileNameMap(Class c, String year, String type,
Map<String, Object> map) throws Exception {
if (c.newInstance() instanceof TJcxxzyptRmtjaj) {
map.put("type", type);
} else {
map.put("type", BBMC_SBN.equals(type) ? ICodeConsts.BBTJ_SJ_SBN
: ICodeConsts.BBTJ_SJ_QN);
}
map.put("class", c);
map.put("year", year);
}
每个调用此方法的地方,都需要利用反射机制newInstance出一个多余的对象,调用1w次就有1w个多余的对象,浪不浪费资源。(如果你说你是这样的豪
79f4ca7ce5cb4647a4e3c3f0836a7ba5.png,那么我shut up)应该会有人有疑惑,这个资源没有浪费,不是用于instanceof判断对象是否是TJcxxzyptRmtjaj类的实例了吗?重点来了。判断Class A是否是Class B或Class B的子子孙孙类(哈哈,大家能理解意思就行),请使用Class类提供的native方法isAssignableFrom,以下是一个简单的使用例子:
public class Test {
public static void main(String[] args) {
//这是用new instance-> instanceof方法
try {
boolean flag = B.class.newInstance() instanceof A;
System.out.println("B newInstance instanceof A:"+flag);
//输出结果:B newInstance instanceof A:true
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
//以下使用class的isAssignableFrom方法
boolean flag = A.class.isAssignableFrom(B.class);
boolean StrFlag = String.class.isAssignableFrom(B.class);
System.out.println("B isAssignableFrom A:"+flag);
//输出结果:B isAssignableFrom A:true
System.out.println("B isAssignableFrom String:"+StrFlag);
//B isAssignableFrom String:false
boolean acFlag = A.class.isAssignableFrom(C.class);
System.out.println("A isAssignableFrom C:"+StrFlag);
//输出结果:A isAssignableFrom C:true
}
}
class A {
}
class B extends A {
}
class C extends B {
}
解释一下:classA.isAssignableFrom(classB),当以下几种情况返回的是true:
- classA与classB指向的是同一个类
- classA是classB的父类或父接口
2. 善用表驱动
public static IYaryProcess getDetailProcess(int yaxxType) {
IYaryProcess yaryProcess = null;
switch (yaxxType) {
case YaJkConsts.YAXX_TYPE_GM:
yaryProcess = new GmxxProcess();
break;
case YaJkConsts.YAXX_TYPE_VALIDATE:
//由于立案风险的身份认证也需要返回具体的人员信息,所以在GmxxProcess类中都进行了处理
yaryProcess = new GmxxProcess();
break;
case YaJkConsts.YAXX_TYPE_LS:
yaryProcess = new LsxxProcess();
break;
case YaJkConsts.YAXX_TYPE_ZZJG:
yaryProcess = new ZzjgxxProcess();
break;
case YaJkConsts.YAXX_TYPE_ZP:
yaryProcess = new PictureProcess();
break;
default:
yaryProcess = new GmxxProcess();
break;
}
return yaryProcess;
}
}
简单工厂设计模式看出来是学了。但是,没学好。为啥?因为每次获取detailProcess都需要new一个出来,浪不浪费资源。可以用表驱动完善吧。不知道表驱动是啥,请问度娘。 ba3eb3531ade42a3950f3851b0469d1b.png
3. 反人类逻辑
public void exec() {
//判断当前时间是否在配置的开启定时任务的时间范围内
if (!initStoreCacheRegion()) {
return;
}
//此处省略100行代码
}
private boolean initStoreCacheRegion() {
String region = ArteryConfigUtil.getProperty("ocr.tag.time.region");
try {
String[] regionParts = region.split(";");
int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
return !(hour < Integer.parseInt(regionParts[0]) && hour > Integer.parseInt(regionParts[1]));
} catch (Exception e) {
return false;
}
}
写代码的时候稍微正常逻辑也不失为一件好事情,这种负负得正的逻辑看着你不晕么?
beaf7239114a4ba1a500dd0967938815.png4. 谨慎使用while
do {
// 支持跨天显示
Date currDate = DateUtils.addDays(dKssj, index);
//中间省略几十行代码,无break代码
index++;
} while (!beginDateStr.equals(endDateStr))
网友评论