JAVA代碼規範

前言

做爲一名全乾打字員,幹活時常常會被要求使用各類各樣的語言去實現各類各樣的需求,來回切換起來寫的代碼就會或多或少有點不規範。今天咱們以JAVA爲例,講講在代碼中,咱們須要注意的某些規範。(本文標準依賴於阿里巴巴的JAVA開發代碼規範)java

示例

如下舉出本猿在工做中經常出現的問題,包括但不只限於:安全

  • 邏輯判斷語句

if/else/for/while/do 語句中必須使用大括號,即便只有一行代碼,避免使用下面的形式:多線程

if(condition) statements;
  • 屬性copy

不少童鞋喜歡使用 Apache Beanutils 進行屬性的copy, Apache BeanUtils 性能較差,咱們應該儘可能避免使用,可使用其餘方案好比 Spring BeanUtils , Cglib BeanCopier併發

TestObject a = new TestObject();
TestObject b = new TestObject();
a.setX(b.getX());
a.setY(b.getY());
  • 覆寫方法

全部的覆寫方法,都必需要加上 @Override 註解。app

  • 類方法命名

方法名、參數名、成員變量、局部變量都應該統一使用 lowerCamelCase ,類名使用 UpperCamelCase 風格,聽從駝峯命名的標準,儘可能避免如 _ -等字符鏈接,但如下情形例外:(領域模型的相關命名)DO / BO / DTO / VO / DAO。另外,類都應該加上建立者的信息,方法名也應該加上對應的參數及用途說明。dom

常量命名應該所有大寫,但此間使用下劃線隔開,力求語義表達完整清楚,不要嫌名字長。ide

  • Random實例

首先 Random 示例包括 java.util.Random 或者 Math.random(),咱們應該避免其被多線程使用,雖然共享該實例是線程安全的,但會因競爭統一 seed 致使性能降低。高併發

ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();
ExecutorService singleThreadPool = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
    singleThreadPool.execute(()-> System.out.println(Thread.currentThread().getName()));
    singleThreadPool.shutdown();

+字符串拼接性能

在循環體內,咱們應當使用 StringBuilderappend 方法進行字符串的鏈接。ui

反例:
    String result;
    for (String string : tagNameList) {
        result = result + string;
    }   
正例:
    StringBuilder stringBuilder = new StringBuilder();
    for (String string : tagNameList) {
        stringBuilder.append(string);
    }
    String result = stringBuilder.toString();
  • equals判斷

不少人喜歡使用下面的代碼進行 equals 判斷是否爲某個值:

public static final String type = "FOOD";
if(Object.equals(type)){
    //do something
}

對象中的equals很容易拋空指針異常,因此咱們應該儘可能使用常量或者肯定有值的對象來調用equals。

public void f(String str){
        String inner = "hi";
        if(inner.equals(str)){
            System.out.println("hello world");
        }
    }
  • 集合初始化

咱們每每在集合初始化的時候忘記指定集合的初始值大小,在高併發的狀況下,這樣極可能會形成內存的使用不當引發一系列的問題。因此在使用諸如 HashMap 的時候儘可能指定初始值的大小。

反例:   
   Map<String, String> map = new HashMap<String, String>();   
正例: 
   Map<String, String> map = new HashMap<String, String>(16);
  • 註釋

方法內部應當使用單行註釋,在被註釋語句的上方另起一行,使用 // 進行註釋,多行註釋則使用 /* */ ,強迫症下應注意與代碼對齊。

public void method() {
        // Put single line comment above code. (Note: align '//' comment with code)
        int a = 3;
    
        /**
        * Some description about follow code. (Note: align '/**' comment with code)
        */
        int b = 4;
    }
  • Switch語句

在每個switch塊內,每個case都必須經過 break/return 來終止或者是註釋說明程序繼續執行到某一個case爲止,而且都應該包含一個 default 語句放在最後,即使沒有代碼。

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

結語

雖然咱們每每寫出的代碼可能不是很高效、簡潔,可是咱們必定注意代碼的可讀性,畢竟代碼除了機器看以外,也是給人看的。

福利

送福利送福利啦,本猿最近得到了三張 5QB 的抵用卷,本着蚊子再小也是肉的原則,把它送給在公衆號上留言的前三位童鞋,留言的前三位童鞋看到後記得在後臺留下QQ號聯繫打字員大大領取福利喲~

相關文章
相關標籤/搜索