天天看點

Java編碼規範

Java編碼規範

  本文講述了Java語言的編碼規範,也是我多年書寫java代碼的總結。其中借鑒了oracle官方的java規範,并且結合現代網際網路企業對java代碼的要求,以及自己在代碼書寫過程中的感悟。盡量做到使代碼美觀,易讀,易維護。由于美觀,易讀的代碼有很多種形式,是以我隻介紹我使用的形式。其實對于公司或者團隊來說,也隻需要一種,也隻能是其中一種。當然有些簡單,大家一直在使用的規律,可能不會全部寫出來,可以直接看官方文檔。

  • 縮進
  • 注釋
  • 聲明
  • 語句
  • 命名規範
  • 代碼範例

1.縮進

  1. 4個空格常被作為縮進排版的一個機關。縮進的确切解釋并未詳細指定(空格 vs. 制表符)。一個制表符等于8個空格(而非4個)。
  2. 盡量避免一行的長度超過80個字元,因為很多終端和工具不能很好處理。
  3. 當一個表達式無法容納在一行時,可以依據以下規則斷開

1.在逗号後面斷開

2.在操作符前面斷開

3.甯可選擇較進階别(higher-level)的斷開,而非較低級别(lower-level)的斷開

4.新的一行應該與上一行同一級别表達式的開頭處對齊

5.如果以上規則導緻你的代碼混亂或者使你的代碼都堆擠在右邊,那就代之以縮進8個空格。

function(longExpression1, longExpression2, longExpression3,
 longExpression4, longExpression5);

var = function1(longExpression1,
               function2(longExpression2,
                         longExpression3));
           

2.注釋

Java程式有兩類注釋:實作注釋(implementation comments)和文檔注釋(document comments)。實作注釋是那些在C++中見過的,使用/…/和//界定的注釋。文檔注釋(被稱為”doc comments”)是Java獨有的,并由/*…/界定。文檔注釋可以通過javadoc工具轉換成HTML檔案。

在注釋裡,對設計決策中重要的或者不是顯而易見的地方進行說明是可以的,但應避免提供代碼中己清晰表達出來的重複資訊。多餘的的注釋很容易過時。

頻繁的注釋有時反映出代碼的低品質。當你覺得被迫要加注釋的時候,考慮一下重寫代碼使其更清晰。
           

塊注釋

塊注釋通常用于提供對檔案,方法,資料結構和算法的描述。塊注釋被置于每個檔案的開始處以及每個方法之前。它們也可以被用于其他地方,比如方法内部。在功能和方法内部的塊注釋應該和它們所描述的代碼具有一樣的縮進格式。

塊注釋之首應該有一個空行,用于把塊注釋和代碼分割開來,比如:

/*
* Here is a block comment.
*/
           

單行注釋

單行注釋(Single-Line Comments)。單行注釋之前應該有一個空行。以下是一個Java代碼中單行注釋的例子:

極短的注釋可以與它們所要描述的代碼位于同一行,但是應該有足夠的空白來分開代碼和注釋。若有多個短注釋出現于大段代碼中,它們應該具有相同的縮進。

if (a == 2) {
          return TRUE;              /* special case */
          } else {
          return isPrime(a);         /* works only for odd a */
          }
           

文檔注釋

文檔注釋描述Java的類、接口、構造器,方法,以及字段(field)。每個文檔注釋都會被置于注釋定界符/*…/之中,一個注釋對應一個類、接口或成員。該注釋應位于聲明之前:

/**
           * The Example class provides ...
           */
           public class Example { ...
           

若你想給出有關類、接口、變量或方法的資訊,而這些資訊又不适合寫在文檔中,則可使用實作塊注釋或緊跟在聲明後面的單行注釋。例如,有關一個類實作的細節,應放入緊跟在類聲明後面的實作塊注釋中,而不是放在文檔注釋中。

文檔注釋不能放在一個方法或構造器的定義塊中,因為Java會将位于文檔注釋之後的第一個聲明與其相關聯。

3.聲明(Declarations)

  1. 每行隻聲明一個變量(友善注釋)
  2. 盡量在聲明局部變量的同時初始化,如int i=0;唯一不這麼做的理由是變量的初始值依賴于某些先前發生的計算
  3. 隻在代碼塊的開始處聲明變量(否則會妨礙代碼在該作用域内的可移植性)
  4. myMethod() {

    int int1 = 0; // beginning of method block

    if (condition) {

    int int2 = 0; // beginning of "if" block

    ...

    }

  5. 在方法名與其參數清單之前的左括号”(“間不要有空格
  6. 左大括号”{“位于聲明語句同行的末尾
  7. 右大括号”}”另起一行,與相應的聲明語句對齊,除非是一個空語句,”}”應緊跟在”{“之後
  8. Sample extends Object {

    int ivar1;

    int ivar2;

    Sample(int i, int j) {

    ivar1 = i;

    ivar2 = j;

    int emptyMethod() {}

  9. 方法與方法之間以空行分隔
  10. 注意:if語句總是用”{“和”}”括起來,避免使用如下容易引起錯誤的格式:
if (condition) //AVOID! THIS OMITS THE BRACES {}!
            statement;
           

4.命名規範(Naming Conventions)

包(Packages)

一個唯一包名的字首總是全部小寫的ASCII字母并且是一個頂級域名,通常是com,edu,gov,mil,net,org。包名的後續部分根據不同機構各自内部的命名規範而不盡相同。這類命名規範可能以特定目錄名的組成來區分部門(department),項目(project),機器(machine),或注冊名(login names)。

com.sun.eng

com.apple.quicktime.v2

edu.cmu.cs.bovik.cheese

類(Classes)

類名是個一名詞,采用大小寫混合的方式,每個單詞的首字母大寫。盡量使你的類名簡潔而富于描述。使用完整單詞,避免縮寫詞(除非該縮寫詞被更廣泛使用,像URL,HTML)

class Raster;

class ImageSprite;

接口(Interfaces)

大小寫規則與類名相似

interface RasterDelegate;

interface Storing;

方法(Methods)

方法名是一個動詞,第一個單詞的首字母小寫,其後單詞的首字母大寫。

run();

runFast();

getBackground();

變量(Variables)

變量名應簡短且富于描述。變量名的選用應該易于記憶,即,能夠指出其用途。盡量避免單個字元的變量名,除非是一次性的臨時變量。臨時變量通常被取名為i,j,k,m和n,它們一般用于整型;c,d,e,它們一般用于字元型。

char c;

int i;

float myWidth;

全局變量(Global Variables)

大小寫規則和變量名相似,除了前面需要一個”m_” ,類似于C++

String m_name;

Customer m_customer;

隻有你看過很多的代碼,很複雜的代碼,你才知道知道一個變量是全局的重要性。然而很多程式員都不這樣做

常量(Constants)

類常量和ANSI常量的聲明,應該全部大寫,單詞間用下劃線隔開。(盡量避免ANSI常量,容易引起錯誤)

static final int MIN_WIDTH = 4;

static final int MAX_WIDTH = 999;

static final int GET_THE_CPU = 1;

5.代碼例子(Code Examples)

/*
            *
            * Copyright (c) 1998-2016 glowd.
            * 2046 Century Road,WUHOU, CHENGDU,CHINA.
            * All rights reserved.
            */
            package com.glowd;
            import com.glowd.silver;
            /**
            * Class description goes here.
            *
            * @version  1.23 18 Mar 2016
            * @author   glowd
            */
            public class Glowd extends God{
                /* A class implementation comment can go here. */
                /** m_num documentation comment */
                public static int m_num;
                /**
                * m_ideaPointdocumentation comment 
                * that happens to be
                * more than one line long
                */
                private static Object m_ideaPoint;
                /** m_friend documentation comment */
                public Object m_friend;
                /** m_students documentation comment */
                private Object[] m_students;
                /**
                * ...constructor glowd documentation comment...
                */
                public Glowd() {
                // ...implementation goes here...
                }
                /**
                * ...method doSomething documentation comment...
                */
                public void doSomething() {
                // ...implementation goes here...
                }
                /**
                * ...method doSomething Else documentation comment...
                * @param someParam description
                */
                public void doSomethingElse(Object someParam) {
                // ...implementation goes here...
                }
            }           

作者:glowd

原文:

https://blog.csdn.net/zengqiang1/article/details/53113549

版權聲明:本文為部落客原創文章,轉載請附上博文連結!