Java代码规范

sonar介绍

Sonar 是一个用于代码质量管理的开放平台。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具。总而言之,它可以告知你代码中的不规范和可能存在的bug

BUG级别

 

Blocker:阻断块。最严重的错误类型;

 

Critical:严重的错误类型;

 

Major:重要的错误类型;

 

Minor:次要的错误类型;

 

Info:一般信息;

Java规范总结

 Java 规则整理(Blocker & Critical)

1.静态对象,用标准的静态块初始化

不规范示例

规范示例

  private static final Map<String, String> MY_MAP = new HashMap<String, String>() {
    // Noncompliant - HashMap should be extended only to add behavior, not for initialization
    {
      put("a", "b");
    }
  };
}
class MyClass {
  private static final Map<String, String> MY_MAP = new HashMap<String, String>();
  static {
    MY_MAP.put("a", "b");
  }
}

2.尽量不要使用synchronized包装过的Java API 

   最好用没有synchronized的API ,多线程可以考虑用显示锁

  • ArrayList or LinkedList instead of Vector
  • Deque instead of Stack
  • HashMap instead of Hashtable
  • StringBuilder instead of StringBuffer

3.工具类加上私有的构造参数

对于工具类,一般是,static 对象的集合,一般不会实例化,java会对类默认加上无参的构造参数,所以显示的加上私有的构造参数

避免被实例化,抽象类也不应该有公共的构造方法。

不规范示例 规范示例
class StringUtils { // Noncompliant

  public static String concatenate(String s1, String s2) {
    return s1 + s2;
  }

}

class StringUtils {

private StringUtils() { }

public static String concatenate(String s1, String s2) { return s1 + s2; }

}

4.不要新建一个对象只为了return

能直接return 就直接return

不规范示例 规范示例
public long computeDurationInMilliseconds() {
  long duration = (((hours * 60) + minutes) * 60 + seconds ) * 1000 ;
  return duration;
}

public void doSomething() {
  RuntimeException myException = new RuntimeException();
  throw myException;
}
public long computeDurationInMilliseconds() {
  return (((hours * 60) + minutes) * 60 + seconds ) * 1000 ;
}

public void doSomething() {
  throw new RuntimeException();
}

5.覆盖方法要加上@Override注解

这有两个好处:

1.编辑器可以帮助检查是否覆盖正确,比如父类是否有这个方法,有可能拼写错了

2.增加代码可读性

6.数组的hashcode和toString

数组的hashCode和toString,他们基本上是无用的。hashCode返回数组的“身份散列码”,几乎和toString返回相同的值。他们的输出实际上没有反映数组的内容。相反,你应该将数组传递给相关的静态数组方法。

不规范示例 规范示例

 public static void main( String[] args )

{
    String argStr = args.toString(); // Noncompliant
    int argHash = args.hashCode(); // Noncompliant

}

 public static void main( String[] args )

{
    String argStr = Arrays.toString(args);
    int argHash = Arrays.hashCode(args);

}

7.不应该直接调用Thread.run() and Runnable.run() 

Thread.run和Runnable.run()的目的都是来使代码在一个单独的、专用的线程执行。直接调用这些方法没有意义,因为它使他们的代码在当前线程执行。

为了得到预期效果,必须用Thread.start()方法

不规范示例 规范示例

 Thread myThread = new Thread(runnable);

myThread.run(); // Noncompliant

 

Thread myThread = new Thread(runnable);
myThread.start(); // Compliant

8.字符串检查应该将字符串放在最左边

可以防止空指针异常

不规范示例 规范示例
String myString = null;
System.out.println("Equal? " + myString.equals("foo"));                       
System.out.println("Equal? " + (myString != null && myString.equals("foo")));  

System.out.println("Equal?" + "foo".equals(myString));

 9.不应该抛出通用的异常

抛出通用的异常,会把正确的信息掩盖

不规范示例 规范示例
public void foo(String bar) throws Throwable {  
  throw new RuntimeException("My Message");     
}
public void foo(String bar) {
  throw new MyOwnRuntimeException("My Message"); 
}

10.定义集合

Java Collections API的目的是提供一个定义良好的接口来隐藏实现细节。实现类必须用来实例化新的集合,而一个实例化的结果应该被存储在一个变量,其类型是一个Java集合接口。

 不规范示例  规范示例
public class Employees {
  private HashSet<Employee> employees = new HashSet<Employee>();  

  public HashSet<Employee> getEmployees() {                     
    return employees;
  }
}
 
 
public class Employees {
  private Set<Employee> employees = new HashSet<Employee>();      // Compliant

  public Set<Employee> getEmployees() {                           // Compliant
    return employees;
  }
}
11.当catch一个异常,不应该丢弃异常信息
不规范示例 规范示例
 // Noncompliant - exception is lost
try { /* ... */ } catch (Exception e) { LOGGER.info("context"); }   

// Noncompliant - exception is lost (only message is preserved)       
try { /* ... */ } catch (Exception e) { LOGGER.info(e.getMessage()); }   

// Noncompliant - exception is lost 
try { /* ... */ } catch (Exception e) { throw new RuntimeException("context"); }
try { /* ... */ } catch (Exception e) { LOGGER.info(e); }   

try { /* ... */ } catch (Exception e) { throw new RuntimeException(e); }

try {
  /* ... */
} catch (RuntimeException e) {
  doSomething();
  throw e;
} catch (Exception e) {
  // Conversion into unchecked exception is also allowed
  throw new RuntimeException(e);
}
 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值