Java解决重复代码的一些思考和方法
1.在日常工作中经常会遇到一些功能逻辑大部分相似只有少量不同的情况,但往往对少部分不同的逻辑处理没有找到好的办法去解决,于是不得不copy大量代码来达到实现功能的目的。
2.什么样的代码才是好代码?1.性能 2.简约
1.性能:即在一定条件下,时间复杂度和空间复杂度都可以在接受的范围内,,跑得越快性能越好。
2.简约:大道至简,宇宙万事万物无不遵从道,得道者多助,失道者寡助。
世间万物复杂的事物都是由一个个简单的事物组成,越简单越贴近道。当然这里也不是说复杂的事务不好,而是说要简单的复杂,而不是复杂的复杂,程序也是如此。写代码一定是怎么简单易懂怎么来,有条理有框架,才能活得更久远,运行更快,更易读易懂。即使程序很复杂,也一定是脉络清晰,而不是一团乱麻。
3.最近在项目中实在不能忍受大量重复代码被制造出来这种现象了,由此开始研究如何精简代码。精简代码不能离开两个字,抽象。工具目前找到了两个,一个是泛型,一个是反射。
下面这段代码是对list集合的操作,大部分逻辑相似,只不过集合内部对象不同,想到这种方法做一下抽象,可以提取重复代码,不过反射效率有点低,有待优化
public <T> BinaryInfo<List<T>, Boolean> assembleEncryptedInformation(List<T> infoList,boolean flag,Class<T> type){
BinaryInfo<List<T>, Boolean> binaryInfo = new BinaryInfo<>();
List<T> ts = new ArrayList<>();
for (T t : infoList) {
T t1 = type.newInstance();
Field[] fields =type.getDeclaredFields();//获得属性
//获得Object对象中的所有方法
for(Field field:fields){
field.setAccessible(true);
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), type);
Method getMethod = pd.getReadMethod();//获得get方法
getMethod.setAccessible(true);
Object value = getMethod.invoke(t);//此处为执行该Object对象的get方法
if (value != null && !"".equals(value.toString())&& !value.toString().startsWith("v")) {
Method setMethod = pd.getWriteMethod();//获得set方法
setMethod.setAccessible(true);
String meyhodName = getMethod.getName();//获的方法名称
if(!meyhodName.equals("getId")){
setMethod.invoke(t1, valueEncrypt);//此处为执行该Object对象的set方法
}
}
}
ts.add(t1);
}
binaryInfo.setFirst(ts);
binaryInfo.setSecond(flag);
return binaryInfo;
}
public class BinaryInfo<A,K> {
private A first;
private K second;
public A getFirst() {
return first;
}
public void setFirst(A first) {
this.first = first;
}
public K getSecond() {
return second;
}
public void setSecond(K second) {
this.second = second;
}
}