代码规范、SonarQube

代码规范 & SonarQube


Sonar代码规范

  1. 注释不宜过多或过少。
  2. 普通方法参数不超过5个,构造方法最多7个参数。
  3. 方法的参数中不要用具体实现类对象,而应该用其接口对象。如使用Map替代LinkedHashMap
  4. 如果遍历Map时同时需要用到keyvalue,应该直接使用entrySet,而不是使用keySetget()获取value
1
2
3
4
5
6
7
8
9
10
11
12
//反例
Map<String, String> map = new HashMap<String, String>();
for(String key : map.keySet()){
String value = map.get(key);
}

//正例
Map<String, String> map = new HashMap<String, String>();
for(Map.Entry<String, String> entry : map.entrySet()){
String key = entry.getKey();
String value = entry.getValue();
}
  1. 每一行代码不超过160个字符,超过需要分行。
  2. 单个方法不超过200行。
  3. 不要在循环体内操作计数器。
  4. 多个if可以通过“||”合并为同一个。
  5. 除非必须线程安全,否则应用StringBuilder替代StringBuffer
  6. 不要用“+”拼接String,应用StringBuilder

    一连串的String拼接在编译器可以优化,但是在循环中使用String拼接,编译器无法优化,应该用StringBuilder进行替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//反例
String s = "";
for(int i = 0; i < 10; i++){
s += i;
}

//正例
StringBuilder sb = new StringBuilder(s);
for(int i = 0; i < 10; i++){
sb.append(i);
}
​```> 一连串的`String`拼接在编译器可以优化,但是**在循环中使用`String`拼接,编译器无法优化,应该用`StringBuilder`进行替换**

​```java
//反例
String s = "";
for(int i = 0; i < 10; i++){
s += i;
}

//正例
StringBuilder sb = new StringBuilder(s);
for(int i = 0; i < 10; i++){
sb.append(i);
}
  1. 在使用一个对象时,需要对其进行非空判断。
  2. 返回空集合Collections.emptyList()而不是null。
  3. 只有静态变量才允许用public修饰。
  4. 一组getter/setter,如果其中一个用synchronized修饰,另一个也要用。
  5. final修饰的字段一般需要加上static
  6. 常量类和工具类需要一个private的构造函数,且该类应定义为final,不可继承。同样,有private构造函数的类必须定义为final
  7. 同一字符串出现超过4次,应定义一个final常量代替。
  8. final常量全大写,非final变量要用驼峰命名,不允许全大写。
  9. 只有final修饰的变量中才允许有下划线。

MapListJava对象加上final后,代表这个对象指向的内存地址不可变,内容和值都是可变的。

  1. 函数声明中不能直接抛出Exception,应精确到具体异常,且最多抛出4个,超过4个应该使用try-catch
  2. catch中抛出异常会使抛出的异常混淆,所以抛出的异常中必须带着原异常信息e。
  3. catch代码块不能为空。
  4. catch中不要用e.printStackTrace(),用LOGGER.error替代。

数据库对象类中不可用LOGGER。
jdk1.7后,可以将一些能自动关闭的资源写在try()中,不需要finally来关闭。如try(FileInputStream fis = new FileInputStream(file) ) {...} catch{}

  1. 不要在try里面写try
  2. Integer需要通过equals比较,因为超过(-128~127)的范围“==”无法比较。但是equals的性能较低。
  3. 不要用new Integer,应该用Integer.valueOf,虽然两者都是返回一个Integer对象。

new Integer每次创建一个新对象;Integer.valueOf会查找缓存数组,如果存在的话,默认在-128~127之间时返回缓存中的已有对象


SonarQube

SonarQube是一个开源的代码质量管理系统,可以用来快速定位代码中的bug、漏洞及不优雅的代码。 支持包括Java, C#, C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等等二十几种编程语言的代码质量管理与检测。通过插件形式,可以整合FindbugsCheckstyle……

下载

前往https://www.sonarqube.org/downloads/下载并解压对应版本的SonarQube

SonarQube 7.9.x LTS (July 2019)要求JDK11或以上,占用2G内存

运行

切换到SonarQube/bin目录的对应系统目录下,运行./sonar.sh start
稍等片刻访问http://localhost:9000/,以admin/admin账号密码即可管理员登录

./sonar.sh --help:帮助
./sonar.sh stop:停止服务
./sonar.sh restart:重启

修改数据库

  • SonarQube默认使用H2数据库,但是不建议使用
  • 修改配置文件:$SONARQUBE_HOME/conf/sonar.properties,找到对应位置添加:
1
2
3
sonar.jdbc.url = yourUrl
sonar.jdbc.username = yourUsername
sonar.jdbc.password = yourPassword
  • 重启服务:./sonar.sh restart

整合Maven,本地使用

1.全局配置

  1. Maven的全局配置文件$MAVEN_PATH/conf/settings.xml(或者.m2/settings.xml)添加:
1
2
3
4
5
6
7
8
9
10
11
12
13
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.jdbc.url>yourUrl</sonar.jdbc.url>
<sonar.jdbc.driver>yourDriver</sonar.jdbc.driver>
<sonar.jdbc.username>yourUsername</sonar.jdbc.username>
<sonar.jdbc.password>yourPassword</sonar.jdbc.password>
<sonar.host.url>http://localhost:9000/</sonar.host.url>
</properties>
</profile>
  1. Maven项目根目录下执行-Dsonar.java.binaries=target/sonar
  2. 访问http://localhost:9000/即可看到分析结果

2.命令行控制

  1. 访问http://localhost:9000/,点击右上角头像 - My Account - Security - Generate New Token填入Token名称,然后点击Generate,复制
  2. mvn sonar:sonar -Dsonar.host.url=http://localhost:9000/ -Dsonar.login=yourToken -Dsonar.java.binaries=target/sonar

插件

http://localhost:9000/ - Administration - Marketplace - Plugins搜索对应的插件,选择Install,重启即可

-------------本文结束感谢您的阅读-------------

本文标题:代码规范、SonarQube

文章作者:DragonBaby308

发布时间:2019年07月08日 - 23:05

最后更新:2019年11月19日 - 00:30

原始链接:http://www.dragonbaby308.com/sonarqube/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%