Java是每個(gè)軟件開(kāi)發(fā)人員都必須接觸的編程語(yǔ)言,初學(xué)Java者感覺(jué)它有些難度,其實(shí)是沒(méi)有掌握J(rèn)ava編程的規(guī)律。本文為大家總結(jié)了寫(xiě)Java程序的26個(gè)基本原則,相信對(duì)新手會(huì)有助益。

    (1) 類(lèi)名首字母應(yīng)該大寫(xiě)。字段、方法以及對(duì)象(句柄)的首字母應(yīng)小寫(xiě)。對(duì)于所有標(biāo)識(shí)符,其中包含的所有單詞都應(yīng)緊靠在一起,而且大寫(xiě)中間單詞的首字母。例如:

  ThisIsAClassName

  thisIsMethodOrFieldName

  若在定義中出現(xiàn)了常數(shù)初始化字符,則大寫(xiě)static final基本類(lèi)型標(biāo)識(shí)符中的所有字母。這樣便可標(biāo)志出它們屬于編譯期的常數(shù)。

 

  (2) 為了常規(guī)用途而創(chuàng)建一個(gè)類(lèi)時(shí),請(qǐng)采取“經(jīng)典形式”,并包含對(duì)下述元素的定義:

  equals()

  hashCode()

  toString()

  clone()(implement Cloneable)

  implement Serializable

  (3) 設(shè)計(jì)一個(gè)類(lèi)時(shí),請(qǐng)?jiān)O(shè)身處地為客戶程序員考慮一下(類(lèi)的使用方法應(yīng)該是非常明確的)。然后,再設(shè)身處地為管理代碼的人考慮一下(預(yù)計(jì)有可能進(jìn)行哪些形式的修改,想想用什么方法可把它們變得更簡(jiǎn)單)。

  (4) 使類(lèi)盡可能短小精悍,而且只解決一個(gè)特定的問(wèn)題。下面是對(duì)類(lèi)設(shè)計(jì)的一些建議:

  ■一個(gè)復(fù)雜的開(kāi)關(guān)語(yǔ)句:考慮采用“多形”機(jī)制

  ■數(shù)量眾多的方法涉及到類(lèi)型差別極大的操作:考慮用幾個(gè)類(lèi)來(lái)分別實(shí)現(xiàn)

  ■許多成員變量在特征上有很大的差別:考慮使用幾個(gè)類(lèi) 。

  (5) 讓一切東西都盡可能地“私有”——private??墒箮?kù)的某一部分“公共化”(一個(gè)方法、類(lèi)或者一個(gè)字段等等),就永遠(yuǎn)不能把它拿出。若強(qiáng)行拿出,就可能破壞其他人現(xiàn)有的代碼,使他們不得不重新編寫(xiě)和設(shè)計(jì)。若只公布自己必須公布的,就可放心大膽地改變其他任何東西。在多線程環(huán)境中,隱私是特別重要的一個(gè)因素——只有private字段才能在非同步使用的情況下受到保護(hù)。

  (6) 謹(jǐn)惕“巨大對(duì)象綜合癥”。對(duì)一些習(xí)慣于順序編程思維、且初涉OOP領(lǐng)域的新手,往往喜歡先寫(xiě)一個(gè)順序執(zhí)行的程序,再把它嵌入一個(gè)或兩個(gè)巨大的對(duì)象里。根據(jù)編程原理,對(duì)象表達(dá)的應(yīng)該是應(yīng)用程序的概念,而非應(yīng)用程序本身。

     (7) 避免使用“魔術(shù)數(shù)字”,這些數(shù)字很難與代碼很好地配合。如以后需要修改它,無(wú)疑會(huì)成為一場(chǎng)噩夢(mèng),因?yàn)楦静恢?ldquo;100”到底是指“數(shù)組大小”還是“其他全然不同的東西”。所以,我們應(yīng)創(chuàng)建一個(gè)常數(shù),并為其使用具有說(shuō)服力的描述性名稱(chēng),并在整個(gè)程序中都采用常數(shù)標(biāo)識(shí)符。這樣可使程序更易理解以及更易維護(hù)。

  (8) 涉及構(gòu)建器和異常的時(shí)候,通常希望重新丟棄在構(gòu)建器中捕獲的任何異常——如果它造成了那個(gè)對(duì)象的創(chuàng)建失敗。這樣一來(lái),調(diào)用者就不會(huì)以為那個(gè)對(duì)象已正確地創(chuàng)建,從而盲目地繼續(xù)。

  (9) 當(dāng)客戶程序員用完對(duì)象以后,若你的類(lèi)要求進(jìn)行任何清除工作,可考慮將清除代碼置于一個(gè)良好定義的方法里,采用類(lèi)似于cleanup()這樣的名字,明確表明自己的用途。除此以外,可在類(lèi)內(nèi)放置一個(gè)boolean(布爾)標(biāo)記,指出對(duì)象是否已被清除。在類(lèi)的finalize()方法里,請(qǐng)確定對(duì)象已被清除,并已丟棄了從RuntimeException繼承的一個(gè)類(lèi)(如果還沒(méi)有的話),從而指出一個(gè)編程錯(cuò)誤。在采取象這樣的方案之前,請(qǐng)確定finalize ()能夠在自己的系統(tǒng)中工作(可能需要調(diào)用System.runFinalizersonExit(true),從而確保這一行為)。

  (10) 若不得已進(jìn)行一些不太雅觀的編程,至少應(yīng)該把那些代碼置于一個(gè)類(lèi)的內(nèi)部。

  (11) 任何時(shí)候只要發(fā)現(xiàn)類(lèi)與類(lèi)之間結(jié)合得非常緊密,就需要考慮是否采用內(nèi)部類(lèi),從而改善編碼及維護(hù)工作(參見(jiàn)第14章14.1.2小節(jié)的“用內(nèi)部類(lèi)改進(jìn)代碼”)。

  (12) 盡可能細(xì)致地加上注釋?zhuān)⒂胘avadoc注釋文檔語(yǔ)法生成自己的程序文檔。

    (13) 在一個(gè)特定的作用域內(nèi),若一個(gè)對(duì)象必須清除(非由垃圾收集機(jī)制處理),請(qǐng)采用下述方法:初始化對(duì)象;若成功,則立即進(jìn)入一個(gè)含有finally從句的try塊,開(kāi)始清除工作。

  (14) 若在初始化過(guò)程中需要覆蓋(取消)finalize(),請(qǐng)記住調(diào)用super.finalize()(若Object屬于我們的直接超類(lèi),則無(wú)此必要)。在對(duì)finalize()進(jìn)行覆蓋的過(guò)程中,對(duì)super.finalize()的調(diào)用應(yīng)屬于最后一個(gè)行動(dòng),而不應(yīng)是第一個(gè)行動(dòng),這樣可確保在需要基礎(chǔ)類(lèi)組件的時(shí)候它們依然有效。

  (15) 創(chuàng)建大小固定的對(duì)象集合時(shí),請(qǐng)將它們傳輸至一個(gè)數(shù)組(若準(zhǔn)備從一個(gè)方法里返回這個(gè)集合,更應(yīng)如此操作)。這樣一來(lái),我們就可享受到數(shù)組在編譯期進(jìn)行類(lèi)型檢查的好處。此外,為使用它們,數(shù)組的接收者也許并不需要將對(duì)象“造型”到數(shù)組里。

  (16) 盡量使用interfaces,不要使用abstract類(lèi)。若已知某樣?xùn)|西準(zhǔn)備成為一個(gè)基礎(chǔ)類(lèi),那么第一個(gè)選擇應(yīng)是將其變成一個(gè)interface(接口)。只有在不得不使用方法定義或者成員變量的時(shí)候,