写了很多业务代码,发现一个现象,就是我们人总是用自己已知的知识来解决问题的。
很多代码写多了习以为常了,就形成了惯性。
写多线程的时候,参数经常有如下写法
Runnable runnable = ()->{};
Callable callable = ()->{return xxx;}
其实如果类比较复杂,或者为了实现更好的复用,应该写一个具体的类,定义属性重写run方法。
另外就是潜意识里总是认为Runnable、Callable是多线程“专用”的类/接口,换句话说其他场景不该用。
其实它和Function/Callable/Consumer等本质是一样的,都是方法接口,只是每个都有自己的特点和用途。
当我们封装工具类时可以把它们当做参数。
关于枚举,我们常规的写法是定义一个整形和字符串属性,然后定义枚举常量,习以为常,以为枚举都是,甚至都应该是这么写的。
其实枚举还可以定义抽象方法
public enum LeaveRequestState {
Submitted {
@Override
public LeaveRequestState nextState() {
return Escalated;
}
@Override
public String responsiblePerson() {
return "Employee";
}
},
Escalated {
@Override
public LeaveRequestState nextState() {
return Approved;
}
@Override
public String responsiblePerson() {
return "Team Leader";
}
},
Approved {
@Override
public LeaveRequestState nextState() {
return this;
}
@Override
public String responsiblePerson() {
return "Department Manager";
}
};
public abstract LeaveRequestState nextState();
public abstract String responsiblePerson();
}
可以通过抽象方法来实现状态机等功能。
业务中需要传输一个日期参数,格式为 yyyyMMdd的数字格式既Integer类型,值为20190909。
怎么办呢?
看到yyyyMMdd第一印象用DateTimeFormatter, 但是格式化后是字符串格式的啊??!
要不然就用LocalDate分别取年、月、日。
如果月小于10,则年乘以100+月;如果月大于10,则年乘以10再加月。
日以此类推。
其实还有更好的方式
public static DateTimeFormatter simpleDateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
/**
* 获取今天的yyyyMMdd的整数形式
*/
public static Integer getToday() {
LocalDate localDate = LocalDate.now();
String format = simpleDateTimeFormatter.format(localDate);
return Integer.valueOf(format);
}
格式化后直接Integer.valueOf就可以了。
虽然没啥难度,但是这个思维转变很重要。
要多积累这种刻板的思维案例,写代码的时候,当发现自己的方法很复杂,就该停下来想想是不是绕弯路了。
我们有时间应该多读一些优秀的开源项目源码,当发现一些“新奇”的写法时,要特别留意。
否则容易以前怎么写就一直怎么写,用一年的经验去干多年的活。
发现源码里好的编程风格,好的编程技巧等要注意学习和积累。
如果觉得本文对你有帮助,欢迎点赞评论,欢迎关注我,我将努力创作更多更好的文章。