java代码规范(根据阿里巴巴插件总结)

1:)long或者Long初始赋值时,必须使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解。 

eg:  Negative example  Long warn = 1l;    Positive example:   Long notwarn = 1L;

2)在if/else/for/while/do语句中必须使用大括号,即使只有一行代码,避免使用下面的形式:if (condition) statements; 

3)所有的覆写方法,必须加@Override注解。 反例:getObject()与get0bject()的问题。一个是字母的O,一个是数字的0,加@Override可以准确判断是否覆盖成功。另外,如果在抽象类中对方法签名进行修改,其实现类会马上编译报错。

  4)获取当前毫秒数:System.currentTimeMillis(); 而不是new Date().getTime(); 

说明:如果想获取更加精确的纳秒级时间值,用System.nanoTime。在JDK8中,针对统计时间等场景,推荐使用Instant类。

 // Positive example: long a = System.currentTimeMillis();   // Negative example:  long b = new Date().getTime();

5)避免用Apache Beanutils进行属性的copy。 说明:Apache BeanUtils性能较差,可以使用其他方案比如Spring BeanUtils, Cglib BeanCopier,推荐使用BeanCopier.copy方法。

6)避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。

 eg:   Negative example     response.SC_GATEWAY_TIMEOUT 
          Positive example:     HTTPServletResponse.SC_GATEWAY_TIMEOUT

7) 不能在finally块中使用return,finally块中的return返回后方法结束执行,不会再执行try块中的return语句。

8)在一个switch块内,每个case要么通过break/return等来终止,要么注释说明程序将继续执行到哪一个case为止;在一个switch块内,都必须包含一个default语句并且放在最后,即使它什么代码也没有

 switch (x) {
        case 1:
            break;
        case 2:
            break;
        default:
    }

9)常量命名应该全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长,所有的枚举类型字段必须要有注释,说明每个数据项的用途。

10)POJO类必须写toString方法。使用工具类source> generate toString时,如果继承了另一个POJO类,注意在前面加一下super.toString。 说明:在方法执行抛出异常时,可以直接调用POJO的toString()方法打印其属性值,便于排查问题。
    public class ToStringDemo extends Super{
        private String secondName;
        @Override
        public String toString() {
            return super.toString() + "ToStringDemo{" + "secondName='" + secondName + '\'' + '}';
        }
    }


    class Super {
        private String firstName;

        @Override
        public String toString() {
            return "Super{" + "firstName=" + firstName + '\'' + '}';
        }
    }

11)不允许任何魔法值(即未经定义的常量)直接出现在代码中。

Negative example :  for(int j=0; j<3 ;j++){
                       ActivitiesRebateGrantBean grant=new ActivitiesRebateGrantBean();}

12)中括号是数组类型的一部分,数组定义如下:String[] args

eg:  Negative example  String str[]=new String[ 1024]      Positive example:   String[]  str=new String[1024]

13)方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使用/* */注释。注意与代码对齐。 
        // Put single line comment above code. (Note: align '//' comment with code)

            int a = 3;

14)集合初始化时,指定集合初始值大小。 说明:HashMap使用如下构造方法进行初始化,尽量指定初始值大小如果暂时无法确定集合大小,那么指定默认值(16)即可。

          Negative example:     Map map = new HashMap();
          Positive example:       Map map = new HashMap(16);
         
15)除常用方法(如getXxx/isXxx)等外,不要在条件判断中执行复杂的语句,将复杂逻辑判断的结果赋值给一个有意义的布尔变量,以提高可读性。 说明:很多if语句内的逻辑相当复杂,阅读者需要分析条件表达式的最终结果,才能明确什么样的条件执行什么样的语句,那么,如果阅读者分析逻辑表达式错误呢?
            
Negative example:
    if ((file.open(fileName, "w") != null) && (...) || (...)) {
        // ...
    }

               
Positive example:
    boolean existed = (file.open(fileName, "w") != null) && (...) || (...);
    if (existed) {
        //...

    }

16)返回类型为基本数据类型,return包装数据类型的对象时,自动拆箱有可能产生NPE (null point Exception)

            

    public int method() {
        Integer a = null;
        return a;
    }

       其他npe场景: 

            数据库的查询结果可能为 null。
            集合里的元素即使 isNotEmpty,取出的数据元素也可能为 null。
            远程调用对象时,一律要求进行空指针判断,防止 NPE。
            对于Session 中获取的数据,建议 NPE 检查,避免空指针。
            级联调用 obj.getA().getB().getC();一连串调用,易产生 NPE。    


17)循环体内,字符串的联接方式,使用StringBuilder的append方法进行扩展。 说明:反编译出的字节码文件显示每次循环都会new出一个StringBuilder对象,然后进行append操作,最后通过toString方法返回String对象,造成内存资源浪费。
            
Negative example:
    String result;
    for (String string : tagNameList) {
        result = result + string;
    }
        
            
Positive example:
    StringBuilder stringBuilder = new StringBuilder();
    for (String string : tagNameList) {
        stringBuilder.append(string);
    }
    String result = stringBuilder.toString();

18)Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。 
            
    public void f(String str){
        String inner = "hi";
        if (inner.equals(str)) {
            System.out.println("hello world");
        }
    }

19)事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务,因为被catch的异常将不会自动回滚。 
            
Positive example 1:
    /**
     * @author caikang
     * @date 2017/04/07
     */
    @Service
    @Transactional(rollbackFor = Exception.class)//直接加在类上的事务注解
    public class UserServiceImpl implements UserService {
        @Override
        public void save(User user) {
            //some code
            //db operation
        }
    }
        
                   
Positive example 2:
    /**
     * @author caikang
     * @date 2017/04/07
     */
    @Service
    public class UserServiceImpl implements UserService {
        @Override
        @Transactional(rollbackFor = Exception.class)
        public void save(User user) {
            //some code
            //db operation
        }
    }
        
        
            
Positive example 3:
    /**
     * @author caikang
     * @date 2017/04/07
     */
    @Service
    public class UserServiceImpl implements UserService {
        @Autowired
        private DataSourceTransactionManager transactionManager;


        @Override
        @Transactional
        public void save(User user) {
            DefaultTransactionDefinition def = new DefaultTransactionDefinition();
            // explicitly setting the transaction name is something that can only be done programmatically
            def.setName("SomeTxName");
            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);


            TransactionStatus status = transactionManager.getTransaction(def);
            try {
                // execute your business logic here
                //db operation
            } catch (Exception ex) {
                transactionManager.rollback(status);
                throw ex;
            }
        }
    }



你可能感兴趣的:(代码规范总结)