陣列宣告,淺談「int[] arr」與「int arr[]」的差異
目的
了解陣列宣告的語法,其「int[] arr」與「int arr[]」的差異。
概要
前些日子,意外看到類似下述的這段程式碼:
Type A
public class Test {public static void main(String[] args) {
int i = 0, intArr[] = {1, 2, 3};
// code...
}
}
它的陣列宣告方式很有意思,它僅用了一行就宣告了一個整數「i」和一個整數陣列「intArr」,但實際上我們很少這樣撰寫,而是會分開撰寫,如下:
Type B
public class Test {public static void main(String[] args) {
int i = 0;
intArr[] = {1, 2, 3};
// code...
}
}
事實上,上述兩種語法都是正確的,但這兩者有怎樣差異呢?筆者預期從各方角度來作探討。
正文
通常來說,「Type A」的語法不常被使用,而且也不建議使用,但該語法既然存在就一定有它的原因,筆者將以各種角度分析之。
就官方的建議
關於「Code Style」這種屬於準則的問題,多數的原廠都會制定一套基本規範,雖然這樣的規範並無太多強制性,但大多數的開發者都是願意遵守的。
事實上,在 「Java 官方文件」中就有明確表示,雖然「int arr[];」這樣的宣告語法是被允許的,但它不建議開發者使用,如下圖:
雖然官方文件中並沒有明確指出不建議使用的原因,但接著,我們將針對幾個角度去作討論。
就可讀性的角度
實際上,筆者認為,這是最重要的考量面向,沒有之一;在程式設計的發展上,「可讀性」、「可維護性」一直都是相當重要的課題。
事實上,「Type A」最致命的缺陷就是可讀性太低,我們來看這段程式碼:
public class Test {public static void main(String[] args) {
int[] arr1[], arr2[][], arr3;
// code...
}
}
是吧?其可讀性並不怎麼好,換「Type B」的方式撰寫,如下:
public class Test {public static void main(String[] args) {
int[] arr3;
int[][] arr1;
int[][][] arr2;
// code...
}
}
是不是好多了?
就程式語意
這時候,或許我們會想,為什麼不乾脆移除「Type A」這種宣告語法?事實上,「Type A」的語法會存在是由於歷史因素。
「Java」源自於「C」,並保留「C」的該項設計,但為什麼「C」是如此的設計呢?
這個問題,筆者曾經詢問某位大神級的前輩,而他說:「他認為『Type A』的宣告語法,其語意更貼近記憶體實際的情況。」,在解釋原因之前,我們陣列在記憶體中的機制,如下圖:
當我們在宣告變數時,其實我們是在向記憶體要空間;然而,「變數宣告」跟「陣列宣告」的差異就只是我們在向記憶體宣告「一格空間」還是宣告「多格」空間,僅此而已。
備註:其實上述的說法並不好,實際上,是「new」的時候才會向記憶體要位置,不過,暫時先將就吧。
接著我們來看「程式語句」,如下:
Code A:
int i;
Code B:
int i[];
Code C:
int[] i;
接著,在其語意上的感覺如下:
Code A:
「向記憶體要『一格』『int 空間』,命名為『i』」。
Code B:
「向記憶體要『多格』『int 空間』,命名為『i』」。
Code C:
「向記憶體要『一個』『多格的 int 空間』,命名為『i』」。
能理解其中差異嗎?
在「Code C」中,其語意比較偏向是將「多格的 int 空間」當作一個整體,而「Code A」跟「Code B」則是將「int 空間」當作一個整體,在跟上述的記憶體圖相比較,顯然後者的語意更貼近「記憶體」的實際運作。
就習慣而言
然而,「約定成俗」是人與人相處之間的一種默契,它存在於很多地方,同樣地,程式也有許多「約定成俗」的事情,尤其是在「Code Style」上。
實際上,「約定成俗」的目的是在增加開發者之間的「共通性」,想當然爾,這也與「可讀性」跟「可維護性」相關;在「StackOverFlow」上也有著相同的討論串:「Difference between int[] array and int array[]」,而多數參與討論的人也跟官方的立場是一致的,圖如下:
事實上,「Type A」的撰寫方式通常只會出現在程式相關的競賽或測驗上,像在刷「Leetcode」時,想要去追求「最精簡解」或是「一行解」時;又或者,你很討厭你的同事時;又或者,你不需要維護代碼時;又或者…。
結論
最後,筆者作個總結,根據筆者多年工作經驗,基本上多數的工作團隊都會有「Code Style」的相關規定,因此,建議是以團隊的規範為最修先。
若工作團隊的相關規範比較自由,那就盡量的大眾化,在「Open Source」當道的現今,不妨多觀摩別人的程式碼,建立良的開發習慣。