一、移除未使用的包,变量,方法
Remove this useless assignment to local variable xxx
移除无用代码并非是一个技术问题,而是一种理念上的和文化上的问题。
二、增加有效注释,移除无用注释
This block of commented-out lines of code should be removed.
这种情况一般出现在对之前的代码进行注释修改后,准备下次修改的时候再拿来参考或者使用,这种是不推荐的大段的代码注释是非常影响阅读的。
我们在开发中需要增加有效注释,移除无用的无效注释。
三、if else 嵌套不要超过3层
Refactor this code to not nest more than 3 if/for/while/switch/try statements.
在写代码的时候,if/for/while/switch/try等代码的嵌套层数建议不要超过3层。当超过3层之后,代码的可读性和可维护性都会变的很差,同时如果做单元测试也会变的很艰难。
if else嵌套很多一般有三个原因
空值判断
业务判断
状态判断
简单的if else语句可以采用三目运算符处理 String str;
if (user.getAge()>18){
str="已成年";
}else {
str="未成年";
}
str=user.getAge()>18?"成年":"未成年";
直接根据状态返回ture false可以直接返回
if(xxx=ture){
return ture;
}esle{
return false;
}
可以直接返回 return xxx=ture;
在我们的业务中,经常要对前端传的值判断是否为空产生多层if else嵌套
可以直接对VO添加@Validate注解判断是否为空
public class entity implements Serializable {
@NotNull(message = "参数不能为空")
private Integer id;
@NotBlank(message = "参数不能为空")
private String projectId;
@NotBlank(message = "参数不能为空")
private String token;
@NotEmpty(message = "参数不能为空")
private List
//这里可以通过正则来校验时间格式是否正确
@NotNull(message = "参数不能为空")
@Pattern(regexp = "xxxx",message ="时间格式不符合规范" )
private Date date;
}
当空值判断,业务判断,状态判断都有时
(1)接口分层:把接口分为外部和内部接口,所有空值判断放在外部接口完成,只处理一次;而内部接口传入的变量由外部接口保证不为空,从而减少空值判断
public void doThings(Customer customer,String listen) {
if (null!=customer.getId()){
if (1 == customer.getId()){
if (customer.getAddress().equals("xxxx")){
//do something
}else {
//do something
}
}
if (2== customer.getId()){
//do something
}
if (3== customer.getId()){
//do something
}
}else {
if ( null== listen){
//do something
}
}
}
可以在外面新加一个方法进行空值判断,判断之后在进行业务判断
业务判断要是有很多,但是又不是太多的话可以将各种业务放到map里面
如果真的很多,而且后续可能还会有变动,值得再写一个策略模式进行实现
四、各种IO流使用完之后一定记得关闭
我们new一个 java流对象之后,就在内存中创建了一个对应类的实例对象,而且占用了一定的系统资源,比如文件句柄,端口,数据库连接等。在内存中的实例对象,当没有引用指向的时候,java垃圾收集器会按照相应的策略自动回收,但是却无法对系统资源进行释放。所以需要我们try-catch-finally手动释放资源
redis的redisTemplate不会主动释放连接,如果新的线程一直调用redis,就会出现redis连接池耗尽资源卡死
try-catch-finally
五、使用@Slf4j注解代替System.out.println
我们使用System.out.println得到的日志信息,关闭之后信息就丢失了,那我们想看到报错等等,就必须要重新运行程序。使用@Slf4j的log不但能持久化日志信息还能对信息进行分级,目前使用的多的有log.debug ();、log.info();、log.warn();、log.erro();
@Slf4j建议和log4j2一起使用
六、返回值是否应该为null
public List
直接返回null可能会导致nullpointerException,返回一个空的集合处理会更好
七、常量 变量命名规则:
代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 反例: *name / __name / / Object$
类名使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例外: DO / BO / DTO / VO / AO 正例: MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion 反例: macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion
方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从 驼峰形式。 正例: localValue / getHttpMessage() / inputUserId
常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。 正例: MAX_STOCK_COUNT 反例: MAX_COUNT
推荐使用阿里编码规约扫描
八、字符串比较的左边放常量,右边放变量
myString.equls("xxxx")
aaa==4
应该修改为
“xxxx”.equls(myString)
4==aaa
可以减少当设置aaa=4这种判断
九、
使用常量而不是直接填“xxxx”
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
推荐在common/const文件中定义
10、定义并抛出一个专用的异常来代替一个通用的异常。
Define and throw a dedicated exception instead of using a generic one
不要全部都使用RuntimeException,尽量具体点,使用它的子类或者自定义异常
11、运算升级降级情况
double x=1+2
建议在使用1L+2L;浮点数是不精确的
需要精确的数建议使用demical
12、一个public 类全是static方法
public static String toJSONString(Object o){
return JSON.toJSONString(o, SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.WriteMapNullValue);
}
}
一个public类里面都是static方法,应该创建一个private的构造方法//避免创建该类的实例。同时不需让其他类继承该类
13 空指针异常
NullPointerException” could be thrown; “document” is nullable here
[图片上传失败...(image-3f9ef9-1597823207341)]
增加空指針檢測
15、枚举命名不规范
举例:Success (0,"执行成功")应该为 SUCCESS (0,"执行成功")
枚举中编译后都是static的,不应该在枚举中生成set方法
16、推荐使用
?和T都表示不确定的类型 但如果是T的话 函数里面可以对T进行操作
17、序列化的对象包含的属性也要序列化
public class Address { //...}
public class Person implements Serializable {
private static final long serialVersionUID = 1905122041950251207L;
private String name;
private Address address;
// Noncompliant; Address isn't serializable
}
如果person已经序列化,其成员变量Address也进行序列化。不然转化时会有问题。