114培訓(xùn)網(wǎng)歡迎您來(lái)到長(zhǎng)沙牛耳教育!

13140882082

全國(guó)統(tǒng)一學(xué)習(xí)專(zhuān)線 9:00-21:00

Java編程開(kāi)發(fā)規(guī)范及其技巧?

在用Java進(jìn)行開(kāi)發(fā)前,一定要牢牢遵守Java的開(kāi)發(fā)規(guī)范,只有這樣你的Java開(kāi)發(fā)之路才能更加順暢。而掌握相應(yīng)的Java開(kāi)發(fā)技巧,凳塌局則可以讓你工作起來(lái)事半功倍。那在編寫(xiě)代碼時(shí)有什么開(kāi)發(fā)規(guī)范和技巧呢?電腦培訓(xùn)給你詳細(xì)介紹一下吧。

1、代碼編寫(xiě)規(guī)范:

代碼編寫(xiě)遵守Java通用開(kāi)發(fā)規(guī)范和必聯(lián)代碼開(kāi)發(fā)規(guī)范;

每個(gè)類(lèi)及方法都要有合理的注釋?zhuān)⑶覍?duì)注釋要持續(xù)維護(hù);

根據(jù)接口需求編寫(xiě)單元測(cè)試用例,再編寫(xiě)實(shí)現(xiàn)類(lèi)使得單元測(cè)試通過(guò),如此循環(huán)往復(fù)以使得所有的單元測(cè)試通過(guò);

要求每個(gè)Java方法的代碼行數(shù)不能超過(guò)100行;

代碼編寫(xiě)按照功能劃分,一個(gè)接口分為多個(gè)方法,每一個(gè)方法做什么事情,做到思路清晰;

接口設(shè)計(jì)盡量做到多兼容性,方便后期開(kāi)發(fā)。


2、數(shù)據(jù)庫(kù)設(shè)計(jì)及SQL規(guī)范

不使用MySQL數(shù)據(jù)庫(kù)外鍵約束,通過(guò)應(yīng)用程序棗讓邏輯實(shí)現(xiàn)關(guān)聯(lián)約束;

適當(dāng)建立索引,經(jīng)常作為查詢條件的字段、*性程度高、長(zhǎng)度不是很長(zhǎng)的、數(shù)量不宜太多,一般一個(gè)表的索引數(shù)目在5個(gè)以內(nèi);

表名長(zhǎng)度不能超過(guò)30個(gè)字符,表名*選擇一個(gè)單詞,能夠準(zhǔn)確清晰明了地表衫源示實(shí)體含義,若必須多個(gè)單詞則以下劃線“_”分隔,單詞所有字母均小寫(xiě);


北大青鳥(niǎo)java培訓(xùn):如何規(guī)范自己的代碼編輯方式?

對(duì)于程序員來(lái)說(shuō),養(yǎng)成良好的代碼寫(xiě)作能力是非常重要的。
今天,我們就一起來(lái)了解一下,規(guī)范化的代碼編寫(xiě)都有哪些要求。
希望通過(guò)對(duì)本文的閱讀,能夠提高大家對(duì)于代碼規(guī)范的認(rèn)識(shí)。
1.保證代碼壓縮后不出錯(cuò)對(duì)于大型的JSP項(xiàng)目,一般會(huì)在產(chǎn)品發(fā)布時(shí)對(duì)項(xiàng)目包含的所有JSP文件進(jìn)行壓縮處理,比如可以利用對(duì)代碼進(jìn)行壓縮,新版jQuery已改用這一工具對(duì)代碼進(jìn)行壓縮,這一般會(huì)去掉開(kāi)發(fā)時(shí)寫(xiě)的注釋?zhuān)ニ锌崭窈蛽Q行,甚至可以把原來(lái)較長(zhǎng)的變量名替換成短且無(wú)意義的變量名,這樣做的目的是加快文件的下載速度,同時(shí)也減小網(wǎng)站訪問(wèn)帶來(lái)的額外數(shù)據(jù)流量,另外在代碼保護(hù)上也起到了一點(diǎn)點(diǎn)作用,至少壓縮后的代碼即使被還原還是沒(méi)那么容易一下讀懂的。
要想代碼能正確通過(guò)壓縮,一般要求語(yǔ)句都要以分號(hào)正常旦饑結(jié)束,大括號(hào)也要嚴(yán)格結(jié)束等,具體還要看壓縮工具的要求。
所以如果一開(kāi)始沒(méi)有按標(biāo)準(zhǔn)來(lái)做,等壓縮出錯(cuò)后再回去找錯(cuò)誤那是浪費(fèi)時(shí)間。
2.保證代碼能通過(guò)特定IDE的自動(dòng)格式化功能一般較為完善的開(kāi)發(fā)工具(比如)都有代碼"自動(dòng)格式"化功能,這一功能幫助實(shí)現(xiàn)統(tǒng)一換行、縮進(jìn)、空格等代碼編排,你可以設(shè)置自己喜歡的格式標(biāo)準(zhǔn),比如左大括號(hào){是否另起一行模核返。
達(dá)到這個(gè)要求的目的在于方便你的開(kāi)發(fā)團(tuán)隊(duì)成員拿你代碼的一個(gè)副本用IDE自動(dòng)格式化成他喜歡或熟悉的風(fēng)格進(jìn)行閱讀。
你同事需要閱讀你的代碼,可能是因?yàn)槟銓?xiě)的是通用方法,他在其它模塊開(kāi)發(fā)過(guò)程中也要使用到,閱讀你的代碼能深入了解方法調(diào)用和實(shí)現(xiàn)的細(xì)節(jié),這是簡(jiǎn)單API文檔不能達(dá)到的效果。
3.使用標(biāo)準(zhǔn)的文檔注釋這一要求算是基本的,這有利于在方法調(diào)用處看到方法的具體傳參提示,也可以利用配套文檔工具生成html或其它格式的開(kāi)發(fā)文檔供其他團(tuán)隊(duì)成員閱讀,你可以嘗試使用jsdoc-toolkit。
如果你自動(dòng)生成的API是出自一個(gè)開(kāi)放平臺(tái),就像facebook.com應(yīng)用,那么你的文檔是給天下所有開(kāi)發(fā)者看的。
另外編寫(xiě)完整注釋?zhuān)哺奖銏F(tuán)隊(duì)成員閱讀你的代碼,通過(guò)你的參數(shù)描述,團(tuán)隊(duì)成員可以很容易知道你編寫(xiě)的方法傳參與實(shí)現(xiàn)細(xì)節(jié)。
當(dāng)然也方便日后代碼維護(hù),這樣即使再大的項(xiàng)目,過(guò)了很長(zhǎng)時(shí)間后,回去改點(diǎn)東西也就不至于自己都忘記了當(dāng)時(shí)自己寫(xiě)的代碼是怎么一回事了。
4.使用規(guī)范有意義的變量名使用規(guī)范有意義的變量名可以提高代碼的可讀性,作為大項(xiàng)目開(kāi)發(fā)成員,自己寫(xiě)的代碼不僅僅要讓別人容易看懂。
電腦培訓(xùn) 的語(yǔ)法與 C++ 及為相似,那么,你知道 Java 的注釋有幾種嗎?是兩種?
// 注釋一行
/* ...... */ 注釋若干行
不完全對(duì),除了以上兩種之外,還有第三種,文檔注釋?zhuān)?br>/** ...... */ 注釋若干行,并寫(xiě)入 javadoc 文檔
注釋要簡(jiǎn)單明了。
String userName = null; //用戶名
邊寫(xiě)代碼邊注釋?zhuān)薷拇a同時(shí)修改相應(yīng)的注釋?zhuān)员WC注釋與代碼的一致性。
在必要的地方注釋?zhuān)⑨屃恳m中。注釋的內(nèi)容要清楚、明了,含義準(zhǔn)確,防止注釋二義性。
保持注釋與其描述的代碼相鄰,即注釋的就近原則。
對(duì)代碼的注釋?xiě)?yīng)放在其上方相鄰位置,不可放在下面。對(duì)數(shù)據(jù)結(jié)構(gòu)的注釋?xiě)?yīng)放在其上方相鄰位置,不可放在下面;對(duì)結(jié)構(gòu)中的每個(gè)域的注搭櫻釋?xiě)?yīng)放在此域的右方;
同一結(jié)構(gòu)中不同域的注釋要對(duì)齊。
變量、常量的注釋?xiě)?yīng)放在其上方相鄰位置或右方。
全局變量要有較詳細(xì)的注釋?zhuān)▽?duì)其功能、取值范圍、哪些函數(shù)或過(guò)程存取它以及存取時(shí)注意事項(xiàng)等的說(shuō)明。
在每個(gè)源文件的頭部要有必要的注釋信息,包括:文件名;版本號(hào);作者;生成日期;模塊功能描述(如功能、主要算法、內(nèi)部各部分之間的關(guān)系、該文件與其它文件關(guān)系等);主要函數(shù)或過(guò)程清單及本文件歷史修改記錄等。
/**
* Copy Right : Neusoft IIT
* Project : eTrain
* JDK version used : jdk1.3.1
* Comments : config path
* Version : 1.01
* history :2003.5.1
* Sr Date Modified By Why & What is modified
* 1. 2003.5.2 Kevin Gao new
**/
在每個(gè)函數(shù)或過(guò)程的前面要有必要的注釋信息,包括:函知伍叢數(shù)或過(guò)程名稱(chēng);功能描述;輸入、輸出及返回值說(shuō)明;調(diào)用關(guān)系及被調(diào)用關(guān)系說(shuō)明等
/**
* :checkout 提款
* @param Hashtable cart info
* @param OrderBean order info
* @return String
*/
public String checkout(Hashtable htCart,
OrderBean orderBean)
throws Exception{
}
javadoc注釋標(biāo)簽語(yǔ)法
@author 對(duì)類(lèi)的說(shuō)明 標(biāo)明開(kāi)發(fā)該類(lèi)模塊的作者
@version 對(duì)類(lèi)的說(shuō)明 標(biāo)明該類(lèi)模塊的版本
@see 對(duì)類(lèi)、屬性、方法的說(shuō)明 參考轉(zhuǎn)向,也就是相關(guān)主題
@param 對(duì)方法的說(shuō)明 對(duì)方法中某參數(shù)的說(shuō)明
@return 對(duì)方法的說(shuō)明 對(duì)方法返回值的說(shuō)明
@exception 對(duì)方法的說(shuō)明 對(duì)方法可能拋出的異常進(jìn)行說(shuō)明
3、命名規(guī)范
定義這個(gè)規(guī)范的目的是讓項(xiàng)目中所有的文檔都看起來(lái)像一個(gè)人寫(xiě)的,增加可讀性,減少項(xiàng)目組中因?yàn)閾Q人而帶來(lái)的損失。(這些規(guī)范并不是一定要絕對(duì)遵守,但是一定要讓程序有良好的可讀性)較短的單詞可通過(guò)去掉元音形成縮寫(xiě);要不然*自己寫(xiě)的代碼自己都看不懂了,那可不行。
較長(zhǎng)的單詞可取單詞的頭幾發(fā)符的優(yōu)先級(jí),并用括號(hào)明確表達(dá)式的操作順序,避免使用默認(rèn)優(yōu)先級(jí)。
使用匈牙利表橘芹示法
Package 的命名
Package 的名字應(yīng)該都是由一個(gè)小寫(xiě)單詞組成。
package com.neu.util
Class 的命名
Class 的名字必須由大寫(xiě)字母開(kāi)頭而其他字母都小寫(xiě)的單詞組成,對(duì)于所有標(biāo)識(shí)符,其中包含的所有單詞都應(yīng)緊靠在一起,而且大寫(xiě)中間單詞的首字母。
public class {}
Class 變量的命名
變量的名字必須用一個(gè)小寫(xiě)字母開(kāi)頭。后面的單詞用大寫(xiě)字母開(kāi)頭
userName ,
Static Final 變量的命名
static Final 變量的名字應(yīng)該都大寫(xiě),并且指出完整含義。
/**
*DBConfig PATH
**/
public static final String
DB_CONFIG_FILE_PATH =com.neu.etrain.dbconfig;
參數(shù)的命名
參數(shù)的名字必須和變量的命名規(guī)范一致。
數(shù)組的命名
數(shù)組應(yīng)該總是用下面的方式來(lái)命名:
byte[] buffer;
而不是:
byte buffer[];
方法的參數(shù)
使用有意義的參數(shù)命名,如果可能的話,使用和要賦值的字段一樣的名字:
(int size){
this.size = size;
}
4、文件樣式
所有的 Java(*.java) 文件都必須遵守如下的樣式規(guī)則:
版權(quán)信息
版權(quán)信息必須在 java 文件的開(kāi)頭,比如:
/*
* Copyright ? 2000 Shanghai XXX Co. Ltd.
* All right reserved.
*/
其他不需要出現(xiàn)在 javadoc 的信息也可以包含在這里。
Package/Imports
package 行要在 import 行之前,import 中標(biāo)準(zhǔn)的包名要在本地的包名之前,而且按照字母
順序排列。如果 import 行中包含了同一個(gè)包中的不同子目錄,則應(yīng)該用 * 來(lái)處理。
package hotlava.net.stats;
import java io.*;
import java.util.;
import hotlava.util.;
這里 java。io.* 使用來(lái)代替 and 的。
Class
接下來(lái)的是類(lèi)的注釋?zhuān)话闶怯脕?lái)解釋類(lèi)的。
/**
* A class a set of packet and byte counters
* It is to allow it to be watched, but only
* reports changes when the current set is complete
*/
接下來(lái)是類(lèi)定義,包含了在不同的行的 extends 和
public class
extends
Cloneable
Class Fields
接下來(lái)是類(lèi)的成員變量:
/**
* Packet counters
*/
protected int[] packets;
public 的成員變量必須生成文檔(JavaDoc)。proceted、private和 package 定義的成
員變量如果名字含義明確的話,可以沒(méi)有注釋。
存取方法
接下來(lái)是類(lèi)變量的存取的方法。它只是簡(jiǎn)單的用來(lái)將類(lèi)的變量賦值獲取值的話,可以簡(jiǎn)單的
寫(xiě)在一行上。
/**
* Get the counters
* @return an array the data. This array has been
* freshly allocated and can be modified by the caller.
*/
public int[] () { return copyArray(packets, offset); }
public int[] getBytes() { return copyArray(bytes, offset); }
public int[] () { return packets; }
public void (int[] packets) { this.packets = packets; }
其它的方法不要寫(xiě)在一行上
構(gòu)造函數(shù)
接下來(lái)是構(gòu)造函數(shù),它應(yīng)該用遞增的方式寫(xiě)(比如:參數(shù)多的寫(xiě)在后面)。
訪問(wèn)類(lèi)型 (public, private 等.) 和 任何 static, final 或 應(yīng)該在一行
中,并且方法和參數(shù)另寫(xiě)一行,這樣可以使方法和參數(shù)更易讀。
public
(int size){
this.size = size;
}
克隆方法
如果這個(gè)類(lèi)是可以被克隆的,那么下一步就是 clone 方法:
public
Object clone() {
try {
obj = ()super.clone();
obj.packets = (int[])packets.clone();
obj.size = size;
return obj;
}catch( e) {
throw new ( : +
e.());
}
}
類(lèi)方法
下面開(kāi)始寫(xiě)類(lèi)的方法:
/**
* Set the packet counters
* (such as when restoring from a database)
*/
protected final
void setArray(int[] r1, int[] r2, int[] r3, int[] r4)
throws
{
//
// Ensure the arrays are of equal size
//
if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length)
throw new (Arrays must be of the same size);
System.arraycopy(r1, 0, r3, 0, r1.length);
System.arraycopy(r2, 0, r4, 0, r1.length);
}
toString 方法
無(wú)論如何,每一個(gè)類(lèi)都應(yīng)該定義 toString 方法:
public
String toString() {
String retval = : ;
for (int i = 0; i < data.length(); i++) {
retval += data.bytes.toString();
retval += data.packets.toString();
}
return retval;
}
}
main 方法
如果main(String[]) 方法已經(jīng)定義了, 那么它應(yīng)該寫(xiě)在類(lèi)的底部.
5、代碼可讀性
避免使用不易理解的數(shù)字,用有意義的標(biāo)識(shí)來(lái)替代。
不要使用難懂的技巧性很高的語(yǔ)句。
源程序中關(guān)系較為緊密的代碼應(yīng)盡可能相鄰。
6、代碼性能
在寫(xiě)代碼的時(shí)候,從頭至尾都應(yīng)該考慮性能問(wèn)題。這不是說(shuō)時(shí)間都應(yīng)該浪費(fèi)在優(yōu)化代碼上,而是我們時(shí)刻應(yīng)該提醒自己要注意代碼的效率。比如:如果沒(méi)有時(shí)間來(lái)實(shí)現(xiàn)一個(gè)高效的算法,那么我們應(yīng)該在文檔中記錄下來(lái),以便在以后有空的時(shí)候再來(lái)實(shí)現(xiàn)她。
不是所有的人都同意在寫(xiě)代碼的時(shí)候應(yīng)該優(yōu)化性能這個(gè)觀點(diǎn)的,他們認(rèn)為性能優(yōu)化的問(wèn)題應(yīng)該在項(xiàng)目的后期再去考慮,也就是在程序的輪廓已經(jīng)實(shí)現(xiàn)了以后。
不必要的對(duì)象構(gòu)造
不要在循環(huán)中構(gòu)造和釋放對(duì)象
使用 對(duì)象
在處理 String 的時(shí)候要盡量使用 類(lèi), 類(lèi)是構(gòu)成 String 類(lèi)的基礎(chǔ)。
String 類(lèi)將 類(lèi)封裝了起來(lái),(以花費(fèi)更多時(shí)間為代價(jià))為開(kāi)發(fā)人員提供了一個(gè)安全的接口。當(dāng)我們?cè)跇?gòu)造字符串的時(shí)候,我們應(yīng)該用 來(lái)實(shí)現(xiàn)大部分的工作,當(dāng)工作完成后將 對(duì)象再轉(zhuǎn)換為需要的 String 對(duì)象。比如:如果有一個(gè)字符串必須不斷地在其后添加許多字符來(lái)完成構(gòu)造,那么我們應(yīng)該使用 對(duì)象和她的 append() 方法。如果我們用 String 對(duì)象代替 對(duì)象的話,會(huì)花費(fèi)許多不必要的創(chuàng)建和釋放對(duì)象的 CPU 時(shí)間。大家可以來(lái)安安DIY創(chuàng)作室一起討論。
避免太多的使用 關(guān)鍵字避免不必要的使用關(guān)鍵字 ,應(yīng)該在必要的時(shí)候再使用她,這是一個(gè)避免死鎖的好方法。
7、編程技巧
byte 數(shù)組轉(zhuǎn)換到
為了將 byte 數(shù)組轉(zhuǎn)換到 ,你可以這么做:
Hello world!.getBytes();
Utility 類(lèi)
Utility 類(lèi)(僅僅提供方法的類(lèi))應(yīng)該被申明為抽象的來(lái)防止被繼承或被初始化。
初始化
下面的代碼是一種很好的初始化數(shù)組的方法:
= new Object[] { arguments };
枚舉類(lèi)型
JAVA 對(duì)枚舉的支持不好,但是下面的代碼是一種很有用的模板:
class Colour {
public static final Colour BLACK = new Colour(0, 0, 0);
public static final Colour RED = new Colour(0xFF, 0, 0);
public static final Colour GREEN = new Colour(0, 0xFF, 0);
public static final Colour BLUE = new Colour(0, 0, 0xFF);
public static final Colour WHITE = new Colour(0xFF, 0xFF, 0xFF);
}
這種技術(shù)實(shí)現(xiàn)了RED, GREEN, BLUE 等可以象其他語(yǔ)言的枚舉類(lèi)型一樣使用的常量。
他們可以用 '==' 操作符來(lái)比較。
但是這樣使用有一個(gè)缺陷:如果一個(gè)用戶用這樣的方法來(lái)創(chuàng)建顏色 BLACK new Colour(0,0,0)
那么這就是另外一個(gè)對(duì)象,'=='操作符就會(huì)產(chǎn)生錯(cuò)誤。她的 equal() 方法仍然有效。由于這個(gè)原因,這個(gè)技術(shù)的缺陷*注明在文檔中,或者只在自己的包中使用。
8、編寫(xiě)格式
代碼樣式
代碼應(yīng)該用 unix 的格式,而不是 windows 的(比如:回車(chē)變成回車(chē)+換行)
文檔化
必須用 javadoc 來(lái)為類(lèi)生成文檔。不僅因?yàn)樗菢?biāo)準(zhǔn),這也是被各種 java 編譯器都認(rèn)可的方法。使用 @author 標(biāo)記是不被推薦的,因?yàn)榇a不應(yīng)該是被個(gè)人擁有的。
縮進(jìn)
縮進(jìn)應(yīng)該是每行2個(gè)空格. 不要在源文件中保存Tab字符. 在使用不同的源代碼管理工具時(shí)Tab字符將因?yàn)橛脩粼O(shè)置的不同而擴(kuò)展為不同的寬度.如果你使用 UltrEdit 作為你的 Java 源代碼編輯器的話,你可以通過(guò)如下操作來(lái)禁止保存Tab字符, 方法是通過(guò) UltrEdit中先設(shè)定 Tab 使用的長(zhǎng)度室2個(gè)空格,然后用 Format|Tabs to Spaces 菜單將 Tab 轉(zhuǎn)換為空格。
頁(yè)寬
頁(yè)寬應(yīng)該設(shè)置為80字符. 源代碼一般不會(huì)超過(guò)這個(gè)寬度, 并導(dǎo)致無(wú)法完整顯示, 但這一設(shè)置也可以靈活調(diào)整. 在任何情況下, 超長(zhǎng)的語(yǔ)句應(yīng)該在一個(gè)逗號(hào)或者一個(gè)操作符后折行. 一條語(yǔ)句折行后, 應(yīng)該比原來(lái)的語(yǔ)句再縮進(jìn)2個(gè)字符.
{} 對(duì)
{} 中的語(yǔ)句應(yīng)該單獨(dú)作為一行. 例如, 下面的第1行是錯(cuò)誤的, 第2行是正確的:
if (i>0) { i ++ }; // 錯(cuò)誤, { 和 } 在同一行
if (i>0) {
i ++
}; // 正確, { 單獨(dú)作為一行
} 語(yǔ)句永遠(yuǎn)單獨(dú)作為一行.如果 } 語(yǔ)句應(yīng)該縮進(jìn)到與其相對(duì)應(yīng)的 { 那一行相對(duì)齊的位置。
括號(hào)
左括號(hào)和后一個(gè)字符之間不應(yīng)該出現(xiàn)空格, 同樣, 右括號(hào)和前一個(gè)字符之間也不應(yīng)該出現(xiàn)空格. 下面的例子說(shuō)明括號(hào)和空格的錯(cuò)誤及正確使用:
CallProc( ); // 錯(cuò)誤
CallProc(); // 正確
不要在語(yǔ)句中使用無(wú)意義的括號(hào). 括號(hào)只應(yīng)該為達(dá)到某種目的而出現(xiàn)在源代碼中。下面的例子說(shuō)明錯(cuò)誤和正確的用法:
if ((I) = 42) { // 錯(cuò)誤 - 括號(hào)毫無(wú)意義
if (I == 42) or (J == 42) then // 正確 - 的確需要括號(hào)
9、代碼編譯
1.編寫(xiě)代碼時(shí)要注意隨時(shí)保存,并定期備份,防止由于斷電、硬盤(pán)損壞等原因造成代碼丟失。
2.同一項(xiàng)目組內(nèi),*使用相同的編輯器,并使用相同的設(shè)置選項(xiàng)。
3.合理地設(shè)計(jì)軟件系統(tǒng)目錄,方便開(kāi)發(fā)人員使用。
4.打開(kāi)編譯器的所有告警開(kāi)關(guān)對(duì)程序進(jìn)行編譯。
5.在同一項(xiàng)目組或產(chǎn)品組中,要統(tǒng)一編譯開(kāi)關(guān)選項(xiàng)。
6.使用工具軟件(如Visual )對(duì)代碼版本進(jìn)行維護(hù)。如果大家有不明白的可以到安安DIY創(chuàng)作室留言。
10、可移植性
Borland Jbulider 不喜歡 這個(gè)關(guān)鍵字,如果你的斷點(diǎn)設(shè)在這些關(guān)鍵字的作用域內(nèi)的話,調(diào)試的時(shí)候你會(huì)發(fā)現(xiàn)的斷點(diǎn)會(huì)到處亂跳,讓你不知所措。除非必須,盡量不要使用。
換行
如果需要換行的話,盡量用 println 來(lái)代替在字符串中使用n。
你不要這樣:
System.out.print(Hello,world!n);
要這樣:
System.out.println(Hello,world!);
或者你構(gòu)造一個(gè)帶換行符的字符串,至少要象這樣:
String newline = System.(line.separator);
System.out.println(Hello world + newline);

已經(jīng)被不贊成()使用,用 來(lái)代替它。

為什么要遵守Java代碼規(guī)范?

在進(jìn)行Java代碼敲寫(xiě)的時(shí)候,我們知道是有很多裂早的Java代碼規(guī)范是需要遵守的,但是有的Java學(xué)員就老是忘記,還有的Java學(xué)員是不屑遵守的,內(nèi)心想著是只要我的Java代碼OK,遵不遵守Java代碼規(guī)范,有什么問(wèn)題呢?其實(shí)是存在問(wèn)題的,為什么要遵守Java代碼規(guī)范?

為什么要遵守Java代碼規(guī)范?當(dāng)你*次接觸到Java代碼規(guī)范的時(shí)候,你是不是覺(jué)得很麻煩呢?比如關(guān)于統(tǒng)一的原則,一再的強(qiáng)調(diào),但是你一再的忘記,或者壓根就不想照做,會(huì)出現(xiàn)什么樣的后果呢?今天回龍觀java培訓(xùn)將借Java代碼規(guī)范中的統(tǒng)一來(lái)說(shuō)說(shuō),自己對(duì)為什么要遵守Java代碼規(guī)范,發(fā)表自己簡(jiǎn)單的看法。


Java代碼規(guī)范中的統(tǒng)一是指,對(duì)于同一個(gè)概念,在程序中用同一種表示方法,比如對(duì)于供應(yīng)商,既可以用supplier,也可以用provider,但是我們只能選定一個(gè)使用,至少在一個(gè)Java項(xiàng)目中保持統(tǒng)一。統(tǒng)一是作為重要的,如果對(duì)同一概念有不同的表示方法,會(huì)使代碼混亂難以理解。即使不能取得好的名稱(chēng),但是只要統(tǒng)一,閱讀起來(lái)也不會(huì)太困難,因?yàn)殚喿x者只要理解一次。


而如果你在一個(gè)項(xiàng)目中不遵守已經(jīng)制定好的統(tǒng)一規(guī)范,那么不僅是給自己帶來(lái)麻煩,也是給其他工作人員帶來(lái)不便,在要進(jìn)行整理陪搭的時(shí)候,你的不同,會(huì)帶來(lái)不必要的交流麻煩。作為一個(gè)Java程序員,你一般是屬于團(tuán)隊(duì)中的一員,你不遵蘆源拿守制定好的Java代碼規(guī)范,其他人也不遵守那么你們的團(tuán)隊(duì)就得亂套了,所以面對(duì)Java代碼規(guī)范的學(xué)習(xí),不要覺(jué)得無(wú)趣,還是得用心記住,并且予以遵守。


java編程規(guī)范?。?!

名稱(chēng) Java語(yǔ)言編碼規(guī)范(Java Code )
 簡(jiǎn)介 本文檔講述了Java語(yǔ)言的編碼規(guī)范,較之陳世忠先生《c++編碼規(guī)范》的浩繁詳盡,此文當(dāng)屬短小精悍了。而其中所列之各項(xiàng)條款,從編碼風(fēng)格,到注意事項(xiàng),不單只Java,對(duì)于其他語(yǔ)言,也都很有借鑒意義。因?yàn)楹?jiǎn)短,所以易記,大家不妨將此作為handbook,常備案頭,逐一對(duì)驗(yàn)。
1 介紹
1.1 為什么要有編碼規(guī)范
1.2 版權(quán)聲明
2 文件名
2.1 文件后綴
2.2 常用文件名
3 文件組織
3.1 Java源文件
3.1.1 開(kāi)頭注釋
3.1.2 包和引入語(yǔ)句
3.1.3 類(lèi)和接口聲明
4 縮進(jìn)排版
4.1 行長(zhǎng)度
4.2 換行
5 注釋
5.1 實(shí)現(xiàn)注釋的格式
5.1.1 塊注釋
5.1.2 單行注釋
5.1.3 尾端注釋
5.1.4 行末注釋
5.2 文擋注釋
6 聲明
6.1 每行聲明變量的數(shù)量
6.2 初始化
6.3 布局
6.4 類(lèi)和接口的聲明
7 語(yǔ)句
7.1 簡(jiǎn)單語(yǔ)句
7.2 復(fù)合語(yǔ)句
7.3 返回語(yǔ)句
7.4 if,if-else,if else-if else語(yǔ)句
7.5 for語(yǔ)句
7.6 while語(yǔ)句
7.7 do-while語(yǔ)句
7.8 switch語(yǔ)句
7.9 try-catch語(yǔ)句
8 空白
8.1 空行
8.2 空格
9 命名規(guī)范
10 編程慣例
10.1 提供對(duì)實(shí)例以及類(lèi)變量的訪問(wèn)控制
10.2 引用類(lèi)變量和類(lèi)方法
10.3 常量
10.4 變量賦值
10.5 其它慣例
10.5.1 圓括號(hào)
10.5.2 返回值
10.5.3 條件運(yùn)算符"?"前的表達(dá)式"?"前的表達(dá)式
10.5.4 特殊注釋
11 代碼范例
11.1 Java源文件范例
1 介紹()
1.1 為什么要有編碼規(guī)范(Why Have Code )
編碼規(guī)范對(duì)于程序員而言尤為重要,有以下幾個(gè)原因:
- 一個(gè)軟件的生命周期中,80%的花費(fèi)在于維護(hù)
- 幾乎沒(méi)有任何一個(gè)軟件,在其整個(gè)生命周期中,均由最初的開(kāi)發(fā)人員來(lái)維護(hù)
- 編碼規(guī)范可以改善軟件的可讀性,可以讓程序員盡快而徹底地理解新的代碼
- 如果你將源碼作為產(chǎn)品發(fā)布,就需要確任它是否被很好的打包并且清晰無(wú)誤,一如你已構(gòu)建的其它任何產(chǎn)品
為了執(zhí)行規(guī)范,每個(gè)軟件開(kāi)發(fā)人員必須一致遵守編碼規(guī)范。每個(gè)人。
1.2 版權(quán)聲明()
本文檔反映的是Sun 公司,Java語(yǔ)言規(guī)范中的編碼標(biāo)準(zhǔn)部盯咐分。主要?jiǎng)P野純貢獻(xiàn)者包括:Peter King,Patrick Naughton,Mike DeMoney,Jonni Kanerva,Kathy Walrath以及Scott Hommel。
本文檔現(xiàn)由Scott Hommel維護(hù),有關(guān)評(píng)論意見(jiàn)請(qǐng)發(fā)至shommel@eng.sun.com
2 文件名(File Names)
這部分列出了常用的文件名及其后綴。
2.1 文件后綴(File Suffixes)
Java程序使用下列文件后綴:
文件類(lèi)別 文件后綴
Java源文件 .java
Java字節(jié)碼文件 .class
2.2 常用文件名(Common File Names)
常用的文件名包括:
文件名 用途
makefiles的*文件名。我們采用gnumake來(lái)創(chuàng)建(build)軟件。
README 概述特定目錄下所含內(nèi)容的文件的*文件名
3 文件組織(File )
一個(gè)文件由被空行分割而成的段落以及標(biāo)識(shí)每個(gè)段落的可選注釋共同組成。超過(guò)2000行的程序難以閱讀,應(yīng)該盡量避免。"Java源文件范例"提供了一個(gè)布局合理的Java程序范例。
3.1 Java源文件(Java Source Files)
每個(gè)Java源文件都包含一個(gè)單一的公共類(lèi)或接口。若私有類(lèi)和接口與一個(gè)公共類(lèi)相關(guān)聯(lián),可以將它們和公共類(lèi)放入同一個(gè)源文件。公共脊昌類(lèi)必須是這個(gè)文件中的*個(gè)類(lèi)或接口。
Java源文件還遵循以下規(guī)則:
- 開(kāi)頭注釋?zhuān)▍⒁?jiàn)"開(kāi)頭注釋")
- 包和引入語(yǔ)句(參見(jiàn)"包和引入語(yǔ)句")
- 類(lèi)和接口聲明(參見(jiàn)"類(lèi)和接口聲明")
3.1.1 開(kāi)頭注釋(Beginning Comments)
所有的源文件都應(yīng)該在開(kāi)頭有一個(gè)C語(yǔ)言風(fēng)格的注釋?zhuān)渲辛谐鲱?lèi)名、版本信息、日期和版權(quán)聲明:
/*
* Classname
*
* Version
*
* Date
*
* Copyright notice
*/
3.1.2 包和引入語(yǔ)句(Package and Import )
在多數(shù)Java源文件中,*個(gè)非注釋行是包語(yǔ)句。在它之后可以跟引入語(yǔ)句。例如:
package java.awt;
import java.awt.peer.;
3.1.3 類(lèi)和接口聲明(Class and Interface )
下表描述了類(lèi)和接口聲明的各個(gè)部分以及它們出現(xiàn)的先后次序。參見(jiàn)"Java源文件范例"中一個(gè)包含注釋的例子。
類(lèi)/接口聲明的各部分 注解
1 類(lèi)/接口文檔注釋(/**……*/) 該注釋中所需包含的信息,參見(jiàn)"文檔注釋"
2 類(lèi)或接口的聲明
3 類(lèi)/接口實(shí)現(xiàn)的注釋(/*……*/)如果有必要的話 該注釋?xiě)?yīng)包含任何有關(guān)整個(gè)類(lèi)或接口的信息,而這些信息又不適合作為類(lèi)/接口文檔注釋。
4 類(lèi)的(靜態(tài))變量 首先是類(lèi)的公共變量,隨后是保護(hù)變量,再后是包一級(jí)別的變量(沒(méi)有訪問(wèn)修飾符,access modifier),*是私有變量。
5 實(shí)例變量 首先是公共級(jí)別的,隨后是保護(hù)級(jí)別的,再后是包一級(jí)別的(沒(méi)有訪問(wèn)修飾符),*是私有級(jí)別的。
6 構(gòu)造器
7 方法 這些方法應(yīng)該按功能,而非作用域或訪問(wèn)權(quán)限,分組。例如,一個(gè)私有的類(lèi)方法可以置于兩個(gè)公有的實(shí)例方法之間。其目的是為了更便于閱讀和理解代碼。
4 縮進(jìn)排版()
4個(gè)空格常被作為縮進(jìn)排版的一個(gè)單位??s進(jìn)的確切解釋并未詳細(xì)指定(空格 vs. 制表符)。一個(gè)制表符等于8個(gè)空格(而非4個(gè))。
4.1 行長(zhǎng)度(Line Length)
盡量避免一行的長(zhǎng)度超過(guò)80個(gè)字符,因?yàn)楹芏嘟K端和工具不能很好處理之。
注意:用于文檔中的例子應(yīng)該使用更短的行長(zhǎng),長(zhǎng)度一般不超過(guò)70個(gè)字符。
4.2 換行(Wrapping Lines)
當(dāng)一個(gè)表達(dá)式無(wú)法容納在一行內(nèi)時(shí),可以依據(jù)如下一般規(guī)則斷開(kāi)之:
- 在一個(gè)逗號(hào)后面斷開(kāi)
- 在一個(gè)操作符前面斷開(kāi)
- 寧可選擇較高級(jí)別(higher-level)的斷開(kāi),而非較低級(jí)別(lower-level)的斷開(kāi)
- 新的一行應(yīng)該與上一行同一級(jí)別表達(dá)式的開(kāi)頭處對(duì)齊
- 如果以上規(guī)則導(dǎo)致你的代碼混亂或者使你的代碼都堆擠在右邊,那就代之以縮進(jìn)8個(gè)空格。
以下是斷開(kāi)方法調(diào)用的一些例子:
(, , ,
, );
var = (,
(,
));
以下是兩個(gè)斷開(kāi)算術(shù)表達(dá)式的例子。前者更好,因?yàn)閿嚅_(kāi)處位于括號(hào)表達(dá)式的外邊,這是個(gè)較高級(jí)別的斷開(kāi)。
longName1 = longName2 * (longName3 + longName4 - longName5)
+ 4 * longname6; //PREFFER
longName1 = longName2 * (longName3 + longName4
- longName5) + 4 * longname6; //AVOID
以下是兩個(gè)縮進(jìn)方法聲明的例子。前者是常規(guī)情形。后者若使用常規(guī)的縮進(jìn)方式將會(huì)使第二行和第三行移得很靠右,所以代之以縮進(jìn)8個(gè)空格
//
(int anArg, Object , String ,
Object ) {
...
}
//INDENT 8 SPACES TO AVOID VERY DEEP INDENTS
private static (int anArg,
Object , String ,
Object ) {
...
}
if語(yǔ)句的換行通常使用8個(gè)空格的規(guī)則,因?yàn)槌R?guī)縮進(jìn)(4個(gè)空格)會(huì)使語(yǔ)句體看起來(lái)比較費(fèi)勁。比如:
//DON’T USE THIS
if (( && )
|| ( && )
||!( && )) { //BAD WRAPS
(); //MAKE THIS LINE EASY TO MISS
}
//USE THIS INSTEAD
if (( && )
|| ( && )
||!( && )) {
();
}
//OR USE THIS
if (( && ) || ( && )
||!( && )) {
();
}
這里有三種可行的方法用于處理三元運(yùn)算表達(dá)式:
alpha = () ? beta : gamma;
alpha = () ? beta
: gamma;
alpha = ()
? beta
: gamma;
5 注釋(Comments)
Java程序有兩類(lèi)注釋?zhuān)簩?shí)現(xiàn)注釋( comments)和文檔注釋(document comments)。實(shí)現(xiàn)注釋是那些在C++中見(jiàn)過(guò)的,使用/*...*/和//界定的注釋。文檔注釋(被稱(chēng)為"doc comments")是Java獨(dú)有的,并由/**...*/界定。文檔注釋可以通過(guò)javadoc工具轉(zhuǎn)換成HTML文件。
實(shí)現(xiàn)注釋用以注釋代碼或者實(shí)現(xiàn)細(xì)節(jié)。文檔注釋從實(shí)現(xiàn)自由(-free)的角度描述代碼的規(guī)范。它可以被那些手頭沒(méi)有源碼的開(kāi)發(fā)人員讀懂。
注釋?xiě)?yīng)被用來(lái)給出代碼的總括,并提供代碼自身沒(méi)有提供的附加信息。注釋?xiě)?yīng)該僅包含與閱讀和理解程序有關(guān)的信息。例如,相應(yīng)的包如何被建立或位于哪個(gè)目錄下之類(lèi)的信息不應(yīng)包括在注釋中。
在注釋里,對(duì)設(shè)計(jì)決策中重要的或者不是顯而易見(jiàn)的地方進(jìn)行說(shuō)明是可以的,但應(yīng)避免提供代碼中己清晰表達(dá)出來(lái)的重復(fù)信息。多余的的注釋很容易過(guò)時(shí)。通常應(yīng)避免那些代碼更新就可能過(guò)時(shí)的注釋。
注意:頻繁的注釋有時(shí)反映出代碼的低質(zhì)量。當(dāng)你覺(jué)得被迫要加注釋的時(shí)候,考慮一下重寫(xiě)代碼使其更清晰。
注釋不應(yīng)寫(xiě)在用星號(hào)或其他字符畫(huà)出來(lái)的大框里。注釋不應(yīng)包括諸如制表符和回退符之類(lèi)的特殊字符。
5.1 實(shí)現(xiàn)注釋的格式( Comment Formats)
程序可以有4種實(shí)現(xiàn)注釋的風(fēng)格:塊(block)、單行(single-line)、尾端(trailing)和行末(end-of-line)。
5.1.1 塊注釋(Block Comments)
塊注釋通常用于提供對(duì)文件,方法,數(shù)據(jù)結(jié)構(gòu)和算法的描述。塊注釋被置于每個(gè)文件的開(kāi)始處以及每個(gè)方法之前。它們也可以被用于其他地方,比如方法內(nèi)部。在功能和方法內(nèi)部的塊注釋?xiě)?yīng)該和它們所描述的代碼具有一樣的縮進(jìn)格式。
塊注釋之首應(yīng)該有一個(gè)空行,用于把塊注釋和代碼分割開(kāi)來(lái),比如:
/*
* Here is a block comment.
*/
塊注釋可以以/*-開(kāi)頭,這樣indent(1)就可以將之識(shí)別為一個(gè)代碼塊的開(kāi)始,而不會(huì)重排它。
/*-
* Here is a block comment with some very special
* that I want indent(1) to ignore.
*
* one
* two
* three
*/
注意:如果你不使用indent(1),就不必在代碼中使用/*-,或?yàn)樗丝赡軐?duì)你的代碼運(yùn)行indent(1)作讓步。
參見(jiàn)"文檔注釋"
5.1.2 單行注釋(Single-Line Comments)
短注釋可以顯示在一行內(nèi),并與其后的代碼具有一樣的縮進(jìn)層級(jí)。如果一個(gè)注釋不能在一行內(nèi)寫(xiě)完,就該采用塊注釋(參見(jiàn)"塊注釋")。單行注釋之前應(yīng)該有一個(gè)空行。以下是一個(gè)Java代碼中單行注釋的例子:
if (condition) {
/* Handle the condition. */
...
}
5.1.3 尾端注釋(Trailing Comments)
極短的注釋可以與它們所要描述的代碼位于同一行,但是應(yīng)該有足夠的空白來(lái)分開(kāi)代碼和注釋。若有多個(gè)短注釋出現(xiàn)于大段代碼中,它們應(yīng)該具有相同的縮進(jìn)。
以下是一個(gè)Java代碼中尾端注釋的例子:
if (a == 2) {
return TRUE; /* special case */
} else {
return isPrime(a); /* works only for odd a */
}
5.1.4 行末注釋(End-Of-Line Comments)
注釋界定符"http://",可以注釋掉整行或者一行中的一部分。它一般不用于連續(xù)多行的注釋文本;然而,它可以用來(lái)注釋掉連續(xù)多行的代碼段。以下是所有三種風(fēng)格的例子:
if (foo > 1) {
// Do a double-flip.
...
}
else {
return false; // Explain why here.
}
//if (bar > 1) {
//
// // Do a triple-flip.
// ...
//}
//else {
// return false;
//}
5.2 文檔注釋( Comments)
注意:此處描述的注釋格式之范例,參見(jiàn)"Java源文件范例"
若想了解更多,參見(jiàn)"How to Write Doc Comments for Javadoc",其中包含了有關(guān)文檔注釋標(biāo)記的信息(@return, @param, @see):
* The Example class provides ...
*/
public class Example { ...
注意頂層(top-level)的類(lèi)和接口是不縮進(jìn)的,而其成員是縮進(jìn)的。描述類(lèi)和接口的文檔注釋的*行(/**)不需縮進(jìn);隨后的文檔注釋每行都縮進(jìn)1格(使星號(hào)縱向?qū)R)。成員,包括構(gòu)造函數(shù)在內(nèi),其文檔注釋的*行縮進(jìn)4格,隨后每行都縮進(jìn)5格。
若你想給出有關(guān)類(lèi)、接口、變量或方法的信息,而這些信息又不適合寫(xiě)在文檔中,則可使用實(shí)現(xiàn)塊注釋(見(jiàn)5.1.1)或緊跟在聲明后面的單行注釋(見(jiàn)5.1.2)。例如,有關(guān)一個(gè)類(lèi)實(shí)現(xiàn)的細(xì)節(jié),應(yīng)放入緊跟在類(lèi)聲明后面的實(shí)現(xiàn)塊注釋中,而不是放在文檔注釋中。
文檔注釋不能放在一個(gè)方法或構(gòu)造器的定義塊中,因?yàn)镴ava會(huì)將位于文檔注釋之后的*個(gè)聲明與其相關(guān)聯(lián)。
6 聲明()
6.1 每行聲明變量的數(shù)量(Number Per Line)
推薦一行一個(gè)聲明,因?yàn)檫@樣以利于寫(xiě)注釋。亦即,
int level; // level
int size; // size of table
要優(yōu)于,
int level, size;
不要將不同類(lèi)型變量的聲明放在同一行,例如:
int foo, fooarray[]; //WRONG!
注意:上面的例子中,在類(lèi)型和標(biāo)識(shí)符之間放了一個(gè)空格,另一種被允許的替代方式是使用制表符:
int level; // level
int size; // size of table
Object ; // currently selected table entry
6.2 初始化()
盡量在聲明局部變量的同時(shí)初始化。*不這么做的理由是變量的初始值依賴于某些先前發(fā)生的計(jì)算。
6.3 布局(Placement)
只在代碼塊的開(kāi)始處聲明變量。(一個(gè)塊是指任何被包含在大括號(hào)"{"和"}"中間的代碼。)不要在首次用到該變量時(shí)才聲明之。這會(huì)把注意力不集中的程序員搞糊涂,同時(shí)會(huì)妨礙代碼在該作用域內(nèi)的可移植性。
void myMethod() {
int int1 = 0; // beginning of method block
if (condition) {
int int2 = 0; // beginning of "if" block
...
}
}
該規(guī)則的一個(gè)例外是for循環(huán)的索引變量
for (int i = 0; i < maxLoops; i++) { ... }
避免聲明的局部變量覆蓋上一級(jí)聲明的變量。例如,不要在內(nèi)部代碼塊中聲明相同的變量名:
int count;
...
myMethod() {
if (condition) {
int count = 0; // AVOID!
...
}
...
}
6.4 類(lèi)和接口的聲明(Class and Interface )
當(dāng)編寫(xiě)類(lèi)和接口是,應(yīng)該遵守以下格式規(guī)則:
- 在方法名與其參數(shù)列表之前的左括號(hào)"("間不要有空格
- 左大括號(hào)"{"位于聲明語(yǔ)句同行的末尾
- 右大括號(hào)"}"另起一行,與相應(yīng)的聲明語(yǔ)句對(duì)齊,除非是一個(gè)空語(yǔ)句,"}"應(yīng)緊跟在"{"之后
class Sample extends Object {
int ivar1;
int ivar2;
Sample(int i, int j) {
ivar1 = i;
ivar2 = j;
}
int () {}
...
}

- 方法與方法之間以空行分隔
7 語(yǔ)句()
7.1 簡(jiǎn)單語(yǔ)句(Simple )
每行至多包含一條語(yǔ)句,例如:
argv++; // Correct
argc--; // Correct
argv++; argc--; // AVOID!
7.2 復(fù)合語(yǔ)句(Compound )
復(fù)合語(yǔ)句是包含在大括號(hào)中的語(yǔ)句序列,形如"{ 語(yǔ)句 }"。例如下面各段。
- 被括其中的語(yǔ)句應(yīng)該較之復(fù)合語(yǔ)句縮進(jìn)一個(gè)層次
- 左大括號(hào)"{"應(yīng)位于復(fù)合語(yǔ)句起始行的行尾;右大括號(hào)"}"應(yīng)另起一行并與復(fù)合語(yǔ)句首行對(duì)齊。
- 大括號(hào)可以被用于所有語(yǔ)句,包括單個(gè)語(yǔ)句,只要這些語(yǔ)句是諸如if-else或for控制結(jié)構(gòu)的一部分。這樣便于添加語(yǔ)句而無(wú)需擔(dān)心由于忘了加括號(hào)而引入bug。
7.3 返回語(yǔ)句(return )
一個(gè)帶返回值的return語(yǔ)句不使用小括號(hào)"()",除非它們以某種方式使返回值更為顯見(jiàn)。例如:
return;
return myDisk.size();
return (size ? size : );
7.4 if,if-else,if else-if else語(yǔ)句(if, if-else, if else-if else )
if-else語(yǔ)句應(yīng)該具有如下格式:
if (condition) {
;
}
if (condition) {
;
} else {
;
}
if (condition) {
;
} else if (condition) {
;
} else{
;
}
注意:if語(yǔ)句總是用"{"和"}"括起來(lái),避免使用如下容易引起錯(cuò)誤的格式:
if (condition) //AVOID! THIS OMITS THE BRACES {}!
statement;
7.5 for語(yǔ)句(for )
一個(gè)for語(yǔ)句應(yīng)該具有如下格式:
for (; condition; update) {
;
}
一個(gè)空的for語(yǔ)句(所有工作都在初始化,條件判斷,更新子句中完成)應(yīng)該具有如下格式:
for (; condition; update);
當(dāng)在for語(yǔ)句的初始化或更新子句中使用逗號(hào)時(shí),避免因使用三個(gè)以上變量,而導(dǎo)致復(fù)雜度提高。若需要,可以在for循環(huán)之前(為初始化子句)或for循環(huán)末尾(為更新子句)使用單獨(dú)的語(yǔ)句。
7.6 while語(yǔ)句(while )
一個(gè)while語(yǔ)句應(yīng)該具有如下格式
while (condition) {
;
}
一個(gè)空的while語(yǔ)句應(yīng)該具有如下格式:
while (condition);
7.7 do-while語(yǔ)句(do-while )
一個(gè)do-while語(yǔ)句應(yīng)該具有如下格式:
do {
;
} while (condition);
7.8 switch語(yǔ)句(switch )
一個(gè)switch語(yǔ)句應(yīng)該具有如下格式:
switch (condition) {
case ABC:
;
/* falls through */
case DEF:
;
break;
case XYZ:
;
break;
default:
;
break;
}
每當(dāng)一個(gè)case順著往下執(zhí)行時(shí)(因?yàn)闆](méi)有break語(yǔ)句),通常應(yīng)在break語(yǔ)句的位置添加注釋。上面的示例代碼中就包含注釋/* falls through */。
7.9 try-catch語(yǔ)句(try-catch )
一個(gè)try-catch語(yǔ)句應(yīng)該具有如下格式:
try {
;
} catch ( e) {
;
}
一個(gè)try-catch語(yǔ)句后面也可能跟著一個(gè)finally語(yǔ)句,不論try代碼塊是否順利執(zhí)行完,它都會(huì)被執(zhí)行。
try {
;
} catch ( e) {
;
} finally {
;
}
8 空白(White Space)
8.1 空行(Blank Lines)
空行將邏輯相關(guān)的代碼段分隔開(kāi),以提高可讀性。
下列情況應(yīng)該總是使用兩個(gè)空行:
- 一個(gè)源文件的兩個(gè)片段(section)之間
- 類(lèi)聲明和接口聲明之間
下列情況應(yīng)該總是使用一個(gè)空行:
- 兩個(gè)方法之間
- 方法內(nèi)的局部變量和方法的*條語(yǔ)句之間
- 塊注釋?zhuān)▍⒁?jiàn)"5.1.1")或單行注釋?zhuān)▍⒁?jiàn)"5.1.2")之前
- 一個(gè)方法內(nèi)的兩個(gè)邏輯段之間,用以提高可讀性
8.2 空格(Blank Spaces)
下列情況應(yīng)該使用空格:
- 一個(gè)緊跟著括號(hào)的關(guān)鍵字應(yīng)該被空格分開(kāi),例如:
while (true) {
...
}

注意:空格不應(yīng)該置于方法名與其左括號(hào)之間。這將有助于區(qū)分關(guān)鍵字和方法調(diào)用。
- 空白應(yīng)該位于參數(shù)列表中逗號(hào)的后面
- 所有的二元運(yùn)算符,除了".",應(yīng)該使用空格將之與操作數(shù)分開(kāi)。一元操作符和操作數(shù)之間不因該加空格,比如:負(fù)號(hào)("-")、自增("++")和自減("--")。例如:
a += c + d;
a = (a + b) / (c * d);
while (d++ = s++) {
n++;
}
printSize("size is " + foo + "n");

- for語(yǔ)句中的表達(dá)式應(yīng)該被空格分開(kāi),例如:
for (expr1; expr2; expr3)

- 強(qiáng)制轉(zhuǎn)型后應(yīng)該跟一個(gè)空格,例如:
myMethod((byte) aNum, (Object) x);
myMethod((int) (cp + 5), ((int) (i + 3)) + 1);
9 命名規(guī)范(Naming )
命名規(guī)范使程序更易讀,從而更易于理解。它們也可以提供一些有關(guān)標(biāo)識(shí)符功能的信息,以助于理解代碼,例如,不論它是一個(gè)常量,包,還是類(lèi)。
標(biāo)識(shí)符類(lèi)型 命名規(guī)則 例子
包(Packages) 一個(gè)*包名的前綴總是全部小寫(xiě)的ASCII字母并且是一個(gè)頂級(jí)域名,通常是com,edu,gov,mil,net,org,或1981年ISO 3166標(biāo)準(zhǔn)所指定的標(biāo)識(shí)*的英文雙字符代碼。包名的后續(xù)部分根據(jù)不同機(jī)構(gòu)各自內(nèi)部的命名規(guī)范而不盡相同。這類(lèi)命名規(guī)范可能以特定目錄名的組成來(lái)區(qū)分*(),項(xiàng)目(project),機(jī)器(machine),或注冊(cè)名(login names)。 com.sun.eng
com.apple.quicktime.v2
edu.cmu.cs.bovik.cheese
類(lèi)(Classes) 命名規(guī)則:類(lèi)名是個(gè)一名詞,采用大小寫(xiě)混合的方式,每個(gè)單詞的首字母大寫(xiě)。盡量使你的類(lèi)名簡(jiǎn)潔而富于描述。使用完整單詞,避免縮寫(xiě)詞(除非該縮寫(xiě)詞被更廣泛使用,像URL,HTML) class Raster;
class ;
接口() 命名規(guī)則:大小寫(xiě)規(guī)則與類(lèi)名相似 interface ;
interface Storing;
方法(Methods) 方法名是一個(gè)動(dòng)詞,采用大小寫(xiě)混合的方式,*個(gè)單詞的首字母小寫(xiě),其后單詞的首字母大寫(xiě)。 run();
runFast();
();
變量(Variables) 除了變量名外,所有實(shí)例,包括類(lèi),類(lèi)常量,均采用大小寫(xiě)混合的方式,*個(gè)單詞的首字母小寫(xiě),其后單詞的首字母大寫(xiě)。變量名不應(yīng)以下劃線或美元符號(hào)開(kāi)頭,盡管這在語(yǔ)法上是允許的。
變量名應(yīng)簡(jiǎn)短且富于描述。變量名的選用應(yīng)該易于記憶,即,能夠指出其用途。盡量避免單個(gè)字符的變量名,除非是一次性的臨時(shí)變量。臨時(shí)變量通常被取名為i,j,k,m和n,它們一般用于整型;c,d,e,它們一般用于字符型。 char c;
int i;
float myWidth;
實(shí)例變量(Instance Variables) 大小寫(xiě)規(guī)則和變量名相似,除了前面需要一個(gè)下劃線 int _;
String _name;
Customer _customer;
常量(Constants) 類(lèi)常量和ANSI常量的聲明,應(yīng)該全部大寫(xiě),單詞間用下劃線隔開(kāi)。(盡量避免ANSI常量,容易引起錯(cuò)誤) static final int MIN_WIDTH = 4;
static final int MAX_WIDTH = 999;
static final int GET_THE_CPU = 1;
10 編程慣例( Practices)
10.1 提供對(duì)實(shí)例以及類(lèi)變量的訪問(wèn)控制(Providing Access to Instance and Class Variables)
若沒(méi)有足夠理由,不要把實(shí)例或類(lèi)變量聲明為公有。通常,實(shí)例變量無(wú)需顯式的設(shè)置(set)和獲取(gotten),通常這作為方法調(diào)用的邊緣效應(yīng) (side effect)而產(chǎn)生。
一個(gè)具有公有實(shí)例變量的恰當(dāng)例子,是類(lèi)僅作為數(shù)據(jù)結(jié)構(gòu),沒(méi)有行為。亦即,若你要使用一個(gè)結(jié)構(gòu)(struct)而非一個(gè)類(lèi)(如果java支持結(jié)構(gòu)的話),那么把類(lèi)的實(shí)例變量聲明為公有是合適的。

java編碼規(guī)范有哪些?

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


若在定義中出現(xiàn)了常數(shù)初始化字符,則大寫(xiě)static final基本類(lèi)型標(biāo)識(shí)符中的所有字母。這樣便可標(biāo)志出它們屬于編譯期的常數(shù)。
Java包(Package)屬于一種特殊情況:它們?nèi)际切?xiě)字母,即便中間的單詞亦是如此。對(duì)于域名擴(kuò)展名稱(chēng),如com,org,net或者edu等,全部都應(yīng)小寫(xiě)(這也是Java 1.1和Java 1.2的區(qū)別之一)。
(2) 為了常規(guī)用途而創(chuàng)建一個(gè)類(lèi)時(shí),請(qǐng)采取"經(jīng)典形式",并包含對(duì)下述元素的定義:
equals()
hashCode()
toString()
clone()(implement Cloneable)
implement
(3) 對(duì)于自己創(chuàng)建的每一個(gè)類(lèi),都考慮置入一個(gè)main(),其中包含了用于測(cè)試那個(gè)類(lèi)的代碼。為使用一個(gè)項(xiàng)目中的類(lèi),我們沒(méi)必要?jiǎng)h除測(cè)試代碼。若進(jìn)行了任何形式的改動(dòng),可方便地返回測(cè)試。這些代碼也可作為如何使用類(lèi)的一個(gè)示例使用。
(4) 應(yīng)將方法含消設(shè)計(jì)成簡(jiǎn)要的、功能性單元,用它描述和實(shí)現(xiàn)一個(gè)不連續(xù)的類(lèi)接口部分。理想情況下,方法應(yīng)簡(jiǎn)明扼要。若長(zhǎng)度很大,可考慮通過(guò)某種方式將其分割成較短的幾個(gè)方法。這樣做也便于類(lèi)內(nèi)代碼的重復(fù)使用(有些時(shí)候,方法必須非常大,但它們?nèi)詰?yīng)只做同樣的一件事情)。
(5) 設(shè)計(jì)一個(gè)類(lèi)時(shí),請(qǐng)?jiān)O(shè)身處地為客戶程序員考慮一下(類(lèi)的使用方法應(yīng)該是非常明確的)。然后,再設(shè)身處地為管理代碼的人考慮一下(預(yù)計(jì)有可能進(jìn)行哪些形式的修改,想想用什么方法可把它們變得更簡(jiǎn)單)。
(6) 使類(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)
(7) 讓一切東西都盡可能地"私有"--private。可使庫(kù)的某一部分"公共化"(一個(gè)方法、類(lèi)或者一個(gè)字段等等),就永遠(yuǎn)不能把它拿出。若強(qiáng)行拿出,就可能破壞其他人現(xiàn)有的代碼,使他們不得不重新編寫(xiě)和設(shè)計(jì)。若只公布自己必須公布的,就可放心大膽地改變其他任何東西。在多線程環(huán)境中,隱私是特別重要的一個(gè)因素--只有private字段才能在非同步使用的情況下受拆老拍到保護(hù)。
(8) 謹(jǐn)惕"巨大對(duì)象綜合癥"。對(duì)一些習(xí)慣于順序編程思維、且初涉OOP領(lǐng)域的新手,往往喜歡先寫(xiě)一個(gè)順序執(zhí)行的程序,再把它嵌入一個(gè)或兩個(gè)巨大的對(duì)象里。根據(jù)編程原理,對(duì)象表達(dá)的應(yīng)該是應(yīng)用程序的概念,而非應(yīng)用程序本身。
(9) 若不得已進(jìn)行一些不太雅觀的編程,至少應(yīng)該把那些代碼置于一個(gè)類(lèi)的內(nèi)部。
(10) 任何時(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)代碼")。
(11) 盡可能細(xì)致地加上注釋?zhuān)⒂胘avadoc注釋文檔語(yǔ)法生成自己的程序文檔。
(12) 避免使用"魔術(shù)數(shù)字",這些數(shù)字很難與代碼很好地配合。如以后需要修改它,無(wú)疑會(huì)成為一場(chǎng)噩夢(mèng),因?yàn)楦静恢?100"到底是指"數(shù)組大小"還是"其他全然不同的東西"。所以,我們應(yīng)創(chuàng)建一個(gè)常數(shù),并為其使用具有說(shuō)服力的描述性名稱(chēng),并在整個(gè)程序中都采用常數(shù)標(biāo)識(shí)符。這樣可使程序更易理解以及更易維護(hù)。
(13) 涉及構(gòu)建器和異常的時(shí)候,通常希望重新丟棄在構(gòu)建器中捕獲的任何異常--如果它造成了那個(gè)對(duì)象的創(chuàng)建失敗。這樣一來(lái),調(diào)用者就不會(huì)以為那個(gè)對(duì)象已正確地創(chuàng)建,從而盲目地繼續(xù)。
(14) 當(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ì)象已被清除,并已丟棄了從繼承的一個(gè)類(lèi)(如果還沒(méi)有的話),從而指出一個(gè)編程錯(cuò)誤。在采取象這樣的方案之前,請(qǐng)確定finalize()能夠在自己的系統(tǒng)中工作(可能需要調(diào)用System.(true),從而確保這一行為)。
(15) 在一個(gè)特定的作用域內(nèi),若一個(gè)對(duì)象必須清除(非由垃圾收集機(jī)制處理),請(qǐng)采用下述方法:初始化對(duì)象;若成功,則立即進(jìn)入一個(gè)含有finally從句的try塊,開(kāi)始清除工作。
(16) 若在初始化過(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í)候它們依然有效。
(17) 創(chuàng)建大小固定的對(duì)象集合時(shí),請(qǐng)將它們傳輸至一個(gè)數(shù)組(若準(zhǔn)備從一個(gè)方法里返回這個(gè)集合,更應(yīng)如此操作)。這樣一來(lái),我們就可享受到數(shù)組在編譯期進(jìn)行類(lèi)型檢查的好處。此外,為使用它們,數(shù)組的接收者也許并不需要將對(duì)象"造型"到數(shù)組里。
(18) 盡量使用,不要使用abstract類(lèi)。若已知某樣?xùn)|西準(zhǔn)備成為一個(gè)基礎(chǔ)類(lèi),那么*個(gè)選擇應(yīng)是將其變成一個(gè)interface(接口)。只有在不得不使用方法定義或者成員變量的時(shí)候,才需要將其變成一個(gè)abstract(抽象)類(lèi)。接口主要描述了客戶希望做什么事情,而一個(gè)類(lèi)則致力于(或允許)具體的實(shí)施細(xì)節(jié)。
(19) 在構(gòu)建器內(nèi)部,只進(jìn)行那些將對(duì)象設(shè)為正確狀態(tài)所需的工作。盡可能地避免調(diào)用其他方法,因?yàn)槟切┓椒赡鼙黄渌烁采w或取消,從而在構(gòu)建過(guò)程中產(chǎn)生不可預(yù)知的結(jié)果(參見(jiàn)第7章的詳細(xì)說(shuō)明)。
(20) 對(duì)象不應(yīng)只是簡(jiǎn)單地容納一些數(shù)據(jù);它們的行為也應(yīng)得到良好的定義。
(21) 在現(xiàn)成類(lèi)的基礎(chǔ)上創(chuàng)建新類(lèi)時(shí),請(qǐng)首先選擇"新建"或"創(chuàng)作"。只有自己的設(shè)計(jì)要求必須繼承時(shí),才應(yīng)考慮這方面的問(wèn)題。若在本來(lái)允許新建的場(chǎng)合使用了繼承,則整個(gè)設(shè)計(jì)會(huì)變得沒(méi)有必要地復(fù)雜。
(22) 用繼承及方法覆蓋來(lái)表示行為間的差異,而用字段表示狀態(tài)間的區(qū)別。一個(gè)非常極端的例子是通過(guò)對(duì)不同類(lèi)的繼承來(lái)表示顏色,這是絕對(duì)應(yīng)該避免的:應(yīng)直接使用一個(gè)"顏色"字段。
(23) 為避免編程時(shí)遇到麻煩,請(qǐng)保證在自己類(lèi)路徑指到的任何地方,每個(gè)名字都僅對(duì)應(yīng)一個(gè)類(lèi)。否則,編譯器可能先找到同名的另一個(gè)類(lèi),并報(bào)告出錯(cuò)消息。若懷疑自己碰到了類(lèi)路徑問(wèn)題,請(qǐng)?jiān)囋囋陬?lèi)路徑的每一個(gè)起點(diǎn),搜索一下同名的.class文件。
(24) 在Java 1.1 AWT中使用事件"適配器"時(shí),特別容易碰到一個(gè)陷阱。若覆蓋了某個(gè)適配器方法,同時(shí)拼寫(xiě)方法沒(méi)有特別講究,*的結(jié)果就是新添加一個(gè)方法,而不是覆蓋現(xiàn)成方法。然而,由于這樣做是完全合法的,所以不會(huì)從編譯器或運(yùn)行期系統(tǒng)獲得任何出錯(cuò)提示--只不過(guò)代碼的工作就變得不正常了。
(25) 用合理的設(shè)計(jì)方案消除"偽功能"。也就是說(shuō),假若只需要?jiǎng)?chuàng)建類(lèi)的一個(gè)對(duì)象,就不要提前限制自己使用應(yīng)用程序,并加上一條"只生成其中一個(gè)"注釋。請(qǐng)考慮將其封裝成一個(gè)"獨(dú)生子"的形式。若在主程序里有大量散亂的代碼,用于創(chuàng)建自己的對(duì)象,請(qǐng)考慮采納一種創(chuàng)造性的方案,將些代碼封裝起來(lái)。
(26) 警惕"分析癱瘓"。請(qǐng)記住,無(wú)論如何都要提前了解整個(gè)項(xiàng)目的狀況,再去考察其中的細(xì)節(jié)。由于把握了全局,可快速認(rèn)識(shí)自己未知的一些因素,防止在考察細(xì)節(jié)的時(shí)候陷入"死邏輯"中。
(27) 警惕"過(guò)早優(yōu)化"。首先讓它運(yùn)行起來(lái),再考慮變得更快--但只有在自己必須這樣做、而且經(jīng)證實(shí)在某部分代碼中的確存在一個(gè)性能瓶頸的時(shí)候,才應(yīng)進(jìn)行優(yōu)化。除非用專(zhuān)門(mén)的工具分析瓶頸,否則很有可能是在浪費(fèi)自己的時(shí)間。性能提升的隱含代價(jià)是自己的代碼變得難于理解,而且難于維護(hù)。
(28) 請(qǐng)記住,閱讀代碼的時(shí)間比寫(xiě)代碼的時(shí)間多得多。思路清晰的設(shè)計(jì)可獲得易于理解的程序,但注釋、細(xì)致的解釋以及一些示例往往具有不可估量的價(jià)值。無(wú)論對(duì)你自己,還是對(duì)后來(lái)的人,它們都是相當(dāng)重要的。如對(duì)此仍有懷疑,那么請(qǐng)?jiān)囅胱约涸噲D從聯(lián)機(jī)Java文檔里找出有用信息時(shí)碰到的挫折,這樣或許能將你說(shuō)服。
(29) 如認(rèn)為自己已進(jìn)行了良好的分析、設(shè)計(jì)或者實(shí)施,那么請(qǐng)稍微更換一下思維角度。試試邀請(qǐng)一些外來(lái)人士--并不一定是專(zhuān)家,但可以是來(lái)自本公司其他*的人。請(qǐng)他們用完全新鮮的眼光考察你的工作,看看是否能找出你一度熟視無(wú)睹的問(wèn)題。采取這種方式,往往能在最適合修改的階段找出一些關(guān)鍵性的問(wèn)題,避免產(chǎn)品發(fā)行后再解決問(wèn)題而造成的金錢(qián)及精力方面的損失。
(30) 良好的設(shè)計(jì)能帶來(lái)*的回報(bào)。簡(jiǎn)言之,對(duì)于一個(gè)特定的問(wèn)題,通常會(huì)花較長(zhǎng)的時(shí)間才能找到一種最恰當(dāng)?shù)慕鉀Q方案。但一旦找到了正確的方法,以后的工作就輕松多了,再也不用經(jīng)歷數(shù)小時(shí)、數(shù)天或者數(shù)月的痛苦掙扎。我們的努力工作會(huì)帶來(lái)*的回報(bào)(甚至無(wú)可估量)。而且由于自己傾注了大量心血,最終獲得一個(gè)出色的設(shè)計(jì)方案,成功的快感也是令人心動(dòng)的。堅(jiān)持****草草完工的誘惑--那樣做往往得不償失

Java項(xiàng)目開(kāi)發(fā)標(biāo)準(zhǔn)

你可以看一個(gè)東西,叫做cmmi。
CMMI全稱(chēng)是 Maturity Model ,鏈清即能力成熟度模型集成(也有稱(chēng)為:軟件能力成熟度集成模型),是美國(guó)國(guó)防部的一個(gè)設(shè)想,1994年由美國(guó)國(guó)防部(United States of Defense)與卡內(nèi)基-梅隆*(Carnegie-Mellon )下的軟件工程研究中心(Software Institute,SEISM)以及美國(guó)國(guó)防工業(yè)協(xié)會(huì)(National Defense )共同開(kāi)發(fā)和研制的,他們計(jì)劃把現(xiàn)在所有現(xiàn)存實(shí)施的與即將被發(fā)展出棚友前來(lái)的各種能力成熟度模型,集成到一個(gè)框架中去,申請(qǐng)此認(rèn)證的前提條件是該企業(yè)具有有效的軟件企業(yè)認(rèn)定證書(shū)。
其目的是幫助軟件企業(yè)對(duì)軟件工程過(guò)程進(jìn)行管理和改進(jìn),增強(qiáng)開(kāi)發(fā)與改進(jìn)能力,從而能按時(shí)地、不超預(yù)算地開(kāi)發(fā)出高質(zhì)量的軟件。其告含所依據(jù)的想法是:只要集中精力持續(xù)努力去建立有效的軟件工程過(guò)程的基礎(chǔ)結(jié)構(gòu),不斷進(jìn)行管理的實(shí)踐和過(guò)程的改進(jìn),就可以克服軟件開(kāi)發(fā)中的困難。CMMI為改進(jìn)一個(gè)組織的各種過(guò)程提供了一個(gè)單一的集成化框架,新的集成模型框架消除了各個(gè)模型的不一致性,減少了模型間的重復(fù),增加透明度和理解,建立了一個(gè)自動(dòng)的、可擴(kuò)展的框架。因而能夠從總體上改進(jìn)組織的質(zhì)量和效率。CMMI主要關(guān)注點(diǎn)就是成本效益、明確重點(diǎn)、過(guò)程集中和靈活性四個(gè)方面。
CMMI 是現(xiàn)在來(lái)說(shuō)最為規(guī)范的項(xiàng)目開(kāi)發(fā)標(biāo)準(zhǔn)。一般上點(diǎn)規(guī)模的公司都起碼要過(guò)cmmi3級(jí)才行。

自學(xué)Java開(kāi)發(fā)要注意什么?

隨著Java行業(yè)發(fā)展的越來(lái)越好,學(xué)Java的朋友也越來(lái)越多,很多人不甘落后,按捺不住自己想學(xué)Java的心,于是開(kāi)始捉摸怎么學(xué)Java。目前*效的學(xué)習(xí)Java的方式就是參加Java培訓(xùn),但是自己不想?yún)⒓覬ava培訓(xùn),想自學(xué)Java該怎么辦呢?別急,沙河電腦培訓(xùn)這就為你支招。

想自學(xué)Java該怎么辦?


1.制定Java學(xué)習(xí)計(jì)劃


自學(xué)Java首先就得有個(gè)Java學(xué)習(xí)計(jì)劃,不然靠今天看看這個(gè)Java知識(shí)點(diǎn),明天看看哪個(gè)Java知識(shí)點(diǎn),永遠(yuǎn)也別想學(xué)好Java。至于Java學(xué)習(xí)計(jì)劃怎么制定,因人而異,不過(guò)你先對(duì)Java知識(shí)體系有個(gè)大致的了解,然后按照你的學(xué)習(xí)時(shí)間來(lái)行橋洞安排Java的學(xué)習(xí)計(jì)劃,Java學(xué)習(xí)計(jì)劃自然是越詳細(xì)越好。


2.保持良好的Java學(xué)習(xí)習(xí)慣


在學(xué)Java中必須保持一些良好的學(xué)習(xí)習(xí)慣,比如你需要有做筆記的習(xí)慣,這樣你有哪些不懂還沒(méi)掌握的,日后翻到了,你還可以看看自己會(huì)不會(huì)解了,進(jìn)行查漏補(bǔ)缺。檔枯比如你還必須遵守,Java代碼中各種各樣的編程規(guī)范,你才能夠在日后寫(xiě)出高質(zhì)量的Java代碼,才能備受企業(yè)喜愛(ài)。


3.學(xué)會(huì)與人進(jìn)行溝通Java技術(shù)


Java技術(shù)的學(xué)習(xí),如果你一個(gè)人關(guān)門(mén)造車(chē),那么你的Java技術(shù)沒(méi)有對(duì)比,你也不知道自己到底掌握的怎么樣了,跟人交流Java技術(shù)特別的有必要,日后你會(huì)知道技術(shù)知識(shí)的交流不僅僅消老在于程序員之間,也會(huì)直面客戶,不管你跟誰(shuí)溝通的好,你的未來(lái)發(fā)展就會(huì)比較好,至少你的人脈資源不會(huì)很差。


J2SE簡(jiǎn)介

多數(shù)編程語(yǔ)言都有預(yù)選編譯好的類(lèi)庫(kù)以支持各種特定的功能 在Java中 類(lèi)庫(kù)以包(package)的形式提供 不同版本的Java提供不同的包 以面向特定的應(yīng)用

Java 平臺(tái)包括 標(biāo)準(zhǔn)版(J SE) 企業(yè)版(J EE)和微縮版(J ME)三個(gè)版本 J SE J ME和J EE 這也就是SunONE(Open )體系 J SE就是Java 的標(biāo)準(zhǔn)版 主要用于桌面應(yīng)用軟件的編程 J ME主要應(yīng)用于嵌入是系統(tǒng)開(kāi)發(fā) 如手機(jī)和PDA的編程 J EE是Java 的企業(yè)版 主要用于分布式的網(wǎng)絡(luò)程序的開(kāi)發(fā) 如電子商務(wù)網(wǎng)站和ERP系統(tǒng)

Standard Edition(標(biāo)準(zhǔn)版) J SE 包含那些構(gòu)成Java語(yǔ)言核心的類(lèi) 比如 數(shù)據(jù)庫(kù)連接 接口定義 輸入/輸出 網(wǎng)絡(luò)編程

Edition(企業(yè)版) J EE 包含J SE 中的類(lèi) 并且還包含用于開(kāi)發(fā)企業(yè)級(jí)應(yīng)用的類(lèi) 比如 EJB servlet JSP XML 事務(wù)控制

Micro Edition(微縮版) J ME 包含J SE中一部分類(lèi) 用于消費(fèi)類(lèi)電子產(chǎn)品的軟件開(kāi)發(fā) 比如 呼機(jī) 智能卡 手機(jī) PDA 機(jī)頂盒

簡(jiǎn)單講就是

j se java simple edtion 小型程序用

j ee java edtion 大型程序用

j me java micro editon 手機(jī)上用

他們的范圍是 J SE包含于J EE中 J ME包乎閉含了J SE的核心類(lèi) 但新添加了一些專(zhuān)有類(lèi)應(yīng)用場(chǎng)合 API的覆蓋范圍各不相同

籠統(tǒng)的講 可以這樣理解 J SE是基礎(chǔ) 壓縮一點(diǎn) 再增加一些CLDC等方面的特性就是J ME 擴(kuò)充一點(diǎn) 再增加一些EJB等企業(yè)應(yīng)用方面的特性就是J EE

補(bǔ)充一點(diǎn)J EE更恰當(dāng)?shù)恼f(shuō) 應(yīng)該是JAVA 企業(yè)開(kāi)發(fā)的技術(shù)規(guī)范 不僅僅是比標(biāo)準(zhǔn)版多了一些類(lèi) J EE又包括許多組件 如Jsp Servlet JavaBean EJB JDBC JavaMail等

J SE商業(yè)版本 標(biāo)準(zhǔn)版本 (Java Standard Edition) 定位在客戶端 主要用于桌面應(yīng)用軟件的歲毀裂編程

J SE 包含那些構(gòu)成Java語(yǔ)言核心的類(lèi)

比如 數(shù)據(jù)庫(kù)連接 接口定義 輸入/輸出 網(wǎng)絡(luò)編程

Java 代碼簽名證書(shū)主要用于證明軟件開(kāi)發(fā)者開(kāi)發(fā)的軟件代碼符合 Sun Java 規(guī)范 您可以使用Java 代碼余彎簽名證書(shū)來(lái)為您的 Java 代碼進(jìn)行數(shù)字簽名 以便通過(guò)互聯(lián)網(wǎng)安全分發(fā) 使得最終用戶能確信您的代碼已經(jīng)通過(guò)權(quán)威的第三方認(rèn)證 而且沒(méi)有在傳輸過(guò)程中被非法篡改和被破壞

Java 代碼簽名證書(shū)可以用于數(shù)字簽名運(yùn)行J ME MIDlet(MIDP )代碼 支持諾基亞和索愛(ài)等手機(jī)的MIDlet應(yīng)用軟件 運(yùn)行簽名后的MIDlet Suite就會(huì)顯示軟件發(fā)行商名稱(chēng) 否則會(huì)顯示讓用戶不敢下載的警告 應(yīng)用軟件來(lái)源未知 繼續(xù)? 同時(shí) 簽名后訪問(wèn)網(wǎng)絡(luò)等都不會(huì)彈出煩人的警告框了 讓手機(jī)應(yīng)用更加安全 更有利于軟件開(kāi)發(fā)商推廣其應(yīng)用軟件 如果需要簽名J SE的 Jar代碼 則推薦您購(gòu)買(mǎi)Thawte Java代碼簽名證書(shū) 因?yàn)槠鋬r(jià)格比VeriSign的便宜 如果您希望有比Thawte Java代碼簽名證書(shū)更便宜的Java代碼簽名證書(shū) 則您可以選購(gòu) WoSign Java代碼簽名證書(shū) 但請(qǐng)注意 WoSign Java代碼簽名證書(shū)只支持Java J SE 版本或以上版本

J SE是J EE的基礎(chǔ) 他大量的JDK代碼庫(kù)是每個(gè)要學(xué)習(xí)J EE的編程人員必須掌握的

/Article/program/Java/JSP/201311/19755

如何寫(xiě)出好的Java代碼

如何寫(xiě)出好的Java代碼
1. 優(yōu)雅需要付出代價(jià)。
從短期利益來(lái)看,對(duì)某個(gè)問(wèn)題提出優(yōu)雅的解決方法,似乎可能花你更多的時(shí)間。但當(dāng)它終于能夠正確執(zhí)行并可輕易套用于新案例中,不需要花上數(shù)以時(shí)計(jì),甚至以天計(jì)或以月計(jì)的辛苦代價(jià)時(shí),你會(huì)看得到先前所花功夫的回報(bào)(即使沒(méi)有人可以衡量這一點(diǎn))。這不僅給你一個(gè)可更容易開(kāi)發(fā)和調(diào)試的程序,也更易于理解和維護(hù)。這正是它在金錢(qián)上的價(jià)值所在。這一點(diǎn)有賴某種人生經(jīng)驗(yàn)才能夠了解,因?yàn)楫?dāng)你努力讓某一段程序代碼變得比較優(yōu)雅時(shí),你并不是處于一種具生產(chǎn)力的狀態(tài)下。但是,請(qǐng)抗拒那些催促你趕工的人們,因?yàn)槟敲醋鲋粫?huì)減緩你的速度罷了。
2. 先求能動(dòng),再求快。
即使你已確定某段程序代碼極為重要,而且是系統(tǒng)的重要瓶頸,這個(gè)準(zhǔn)則依然成立。盡可能簡(jiǎn)化設(shè)計(jì),讓系統(tǒng)能夠先正確動(dòng)作。如果程序的執(zhí)行不夠快,再量測(cè)其效能。幾乎你總是會(huì)發(fā)現(xiàn),你所認(rèn)為的”瓶頸”其實(shí)都不是問(wèn)題所在。把你擾返的時(shí)間花在刀口上吧。
3. 記住”各個(gè)擊破”的原理。
如果你所探討的問(wèn)題過(guò)于混雜,試著想像該問(wèn)題的基本動(dòng)作會(huì)是什么,并假設(shè)這一小塊東西能夠神奇地處理掉最難的部分。這”一小塊”東西其實(shí)就是對(duì)象–請(qǐng)撰寫(xiě)運(yùn)用該對(duì)象的程序代碼,然后檢視對(duì)象,并將其中困難的部分再包裝成其他對(duì)象,依此類(lèi)推。
4. 區(qū)分class開(kāi)發(fā)者和class使用者(使用端程序員)。
Class 使用者扮演著”客戶”角色,不需要(也不知道)class的底層運(yùn)作方式。Class開(kāi)發(fā)者必須是class設(shè)計(jì)專(zhuān)家,并撰寫(xiě)class,使它能夠盡可能被大多數(shù)新手程序員所用,而且在程序中能夠穩(wěn)當(dāng)執(zhí)行。一套程序庫(kù)只有在具備通透性的情況下,使用起來(lái)才會(huì)容易。
5.當(dāng)你撰寫(xiě)class時(shí),試著給予明了易懂的名稱(chēng),減少不必要的注解。
你給客戶端程序員的接口,應(yīng)該保持概念上的單純性。不了這個(gè)目的,當(dāng)函數(shù)的重載()適合制作出直覺(jué)、易用的接口時(shí),請(qǐng)善加使用。
6. 也必你的分析和設(shè)計(jì)必須讓系統(tǒng)中的classes保持最少,須讓其Public 保持最少,以及讓這些classes和其他classes之間的關(guān)聯(lián)性( 尤其是base classes)保持最少。
如果你的設(shè)計(jì)所得結(jié)果更甚于此,請(qǐng)問(wèn)問(wèn)自己,是否其中每一樣?xùn)|西在整個(gè)程序生命期中都饒富價(jià)值?如果并非如此,那么,維護(hù)它們會(huì)使你付出代價(jià)。開(kāi)發(fā)團(tuán)隊(duì)的成員都有不維護(hù)”無(wú)益于生產(chǎn)力提升”的任何東西的傾向;這是許多設(shè)計(jì)方法無(wú)法解釋的現(xiàn)象。
7. 讓所有東西盡謹(jǐn)李坦量自動(dòng)化。先撰寫(xiě)測(cè)試用的程序代碼(在你撰寫(xiě)class之前),并讓它和class結(jié)合在一起。請(qǐng)祥桐使用makefile或類(lèi)似工具,自動(dòng)進(jìn)行測(cè)試動(dòng)作。
通過(guò)這種方式,只要執(zhí)行測(cè)試程序,所有的程序變動(dòng)就可以自動(dòng)獲得驗(yàn)證,而且可以立即發(fā)現(xiàn)錯(cuò)誤。由于你知道的測(cè)試架構(gòu)所具備的安全性,所以當(dāng)你發(fā)現(xiàn)新的需求時(shí),你會(huì)更勇于進(jìn)行全面修改。請(qǐng)記住,程序語(yǔ)言*的改進(jìn),是來(lái)自型別檢查、異常處理等機(jī)制所賦予的內(nèi)置測(cè)試動(dòng)作。但這些功能只能協(xié)助你到達(dá)某種程度。開(kāi)發(fā)一個(gè)穩(wěn)固系統(tǒng)時(shí),你得自己驗(yàn)證自己的classes或程序的性質(zhì)。
8. 在你撰寫(xiě)class之前先寫(xiě)測(cè)試碼,以便驗(yàn)證你的class 是否設(shè)計(jì)完備。如果你無(wú)法撰寫(xiě)測(cè)試碼,你便無(wú)法知道你的class 的可能長(zhǎng)相。撰寫(xiě)測(cè)試碼通常能夠顯現(xiàn)出額外的特性(features)或限制 ( )__它們并不一定總是能夠在分析和設(shè)計(jì)過(guò)程中出現(xiàn)。測(cè)試碼也可做為展示class 用法的示例程序。
9. 所有軟件設(shè)計(jì)上的問(wèn)題,都可以通過(guò)”引入額外的概念性間接層( )”加以簡(jiǎn)化。這個(gè)軟件工程上的基礎(chǔ)法則是抽象化概念的根據(jù),而抽象化概念正是面向?qū)ο蟪绦蛟O(shè)計(jì)的主要性質(zhì)。
10. 間接層()應(yīng)該要有意義(和準(zhǔn)則-9致)。
這里所指的意義可以像”將共用程序代碼置于惟一函數(shù)”這么簡(jiǎn)單。如果你加入的間接層(或抽象化、或封裝等等)不具意義,它可能就和沒(méi)有適當(dāng)?shù)拈g接層一樣糟糕。
11. 讓class盡可能微小而無(wú)法切割(atomic)。
賦予每個(gè)class單一而清楚的用途。如果你的classes或你的系統(tǒng)成長(zhǎng)得過(guò)于復(fù)雜,請(qǐng)將復(fù)雜的classes切割成比較簡(jiǎn)單的幾個(gè)classes。最明顯的一個(gè)判斷指針就是class的大?。喝绻艽螅敲此ぷ髁窟^(guò)多的機(jī)會(huì)就可能很高,那就應(yīng)該被切割。重新設(shè)計(jì)class的建議線索是:
1) 復(fù)雜的switch語(yǔ)句:請(qǐng)考慮運(yùn)用多態(tài)()。
2) 許多函數(shù)各自處理類(lèi)型極為不同的動(dòng)作:請(qǐng)考慮切割為多個(gè)不同的(classes)。
12. 小心冗長(zhǎng)的引數(shù)列(argument lists)。
冗長(zhǎng)的引數(shù)列會(huì)使函數(shù)的調(diào)用動(dòng)作不易撰寫(xiě)、閱讀、維護(hù)。你應(yīng)該試著將函數(shù)搬移到更適當(dāng)?shù)腸lass中,并盡量以對(duì)象為引數(shù)。
13. 不要一再重復(fù)。
如果某段程序代碼不斷出現(xiàn)于許多derived class函數(shù)中,請(qǐng)將該段程序代碼置于某個(gè)base class 函數(shù)內(nèi),然后在derived class函數(shù)中調(diào)用。這么做不僅可以省下程序代碼空間,也可以讓修改該段程序代碼動(dòng)作更易于進(jìn)行。有時(shí)候找出此種共通程序代碼還可以為接口增加實(shí)用功能。
14. 小心switch語(yǔ)句或成串的if-else 子句。
通常這種情況代表所謂的”type-check coding”。也就是說(shuō)究竟會(huì)執(zhí)行哪一段程序代碼,乃是依據(jù)某種型別信息來(lái)做抉擇(最初,確切型別可能不十分明顯)。你通??梢允褂美^承和多態(tài)來(lái)取代此類(lèi)程序代碼; method (多態(tài)函數(shù))的調(diào)用會(huì)自動(dòng)執(zhí)行此類(lèi)型別檢驗(yàn),并提供更可靠更容易的擴(kuò)充性。
15. 從設(shè)計(jì)觀點(diǎn)來(lái)看,請(qǐng)找出變動(dòng)的事物,并使它和不變的事物分離。
也就是說(shuō),找出系統(tǒng)中可能被你改變的元素,將它們封裝于classes中。你可以在《Thinking in Patterns with Java》(可免費(fèi)下載于 www. . Com)大量學(xué)習(xí)到這種觀念。
16. 不要利用來(lái)擴(kuò)充基礎(chǔ)功能。
如果某個(gè)接口元素對(duì)class而言極重要,它應(yīng)該被放在base class 里頭,而不是直到衍生()時(shí)才被加入。如果你在繼承過(guò)程中加入了函數(shù),或許你應(yīng)該重新思考整個(gè)設(shè)計(jì)。
17. 少就是多。
從class 的最小接口開(kāi)始妨展,盡可能在解決問(wèn)題的前提下讓它保持既小又單純。不要預(yù)先考量你的class被使用的所有可能方式。一旦class被實(shí)際運(yùn)用,你自然會(huì)知道你得如何擴(kuò)充接口。不過(guò),一旦class被使用后,你就無(wú)法在不影響客戶程序代碼的情況下縮減其接口。如果你要加入更多函數(shù)倒是沒(méi)有問(wèn)題–不會(huì)影響既有的客戶程序代碼,它們只需重新編譯即可。但即使新函數(shù)取代了舊函數(shù)的功能,也請(qǐng)你保留既有接口。如果你得通過(guò)”加入更多引數(shù)”的方式來(lái)擴(kuò)充既有函數(shù)的接口,請(qǐng)你以新引數(shù)寫(xiě)出一個(gè)重載化的函數(shù);通過(guò) 這種方式就不會(huì)影響既有函數(shù)的任何客戶了。
18. 大聲念出你的classes,確認(rèn)它們符合邏輯。
請(qǐng)base class和derived class 之間的關(guān)系是”is-a”(是一種),讓class和成員對(duì)象之間的關(guān)系是”has-a”(有一個(gè))。
19. 當(dāng)你猶豫不決于繼承()或合成(組合,)時(shí),請(qǐng)你問(wèn)問(wèn)自己,是否需要向上轉(zhuǎn)型(upcast)為基礎(chǔ)型別。
如果不需要,請(qǐng)優(yōu)先選擇合成(也就是是使用成員對(duì)象)。這種作法可以消除”過(guò)多基礎(chǔ)型別”。如果你采用繼承,使用者會(huì)認(rèn)為他們應(yīng)該可以向上轉(zhuǎn)型。
20. 運(yùn)用數(shù)據(jù)成員來(lái)表示數(shù)值的變化,運(yùn)用經(jīng)過(guò)覆寫(xiě)的函數(shù)(overrided method)來(lái)代表行為的變化 。
也就是說(shuō),如果你找到了某個(gè) class, 帶有一些狀態(tài)變量,而其函數(shù)會(huì)依據(jù)這些變量值切換不同的行為,那么你或許就應(yīng)該重新設(shè)計(jì),在 和覆寫(xiě)后的函數(shù)(overrided methods)中展現(xiàn)行為止的差異。
21. 小心重載()。
函數(shù)不應(yīng)該依據(jù)引數(shù)值條件式地選擇執(zhí)行某一段程序代碼。這種情況下你應(yīng)該撰寫(xiě)兩個(gè)或更多個(gè)重載函數(shù)( methods)
22. 使用異常體系(exception )
*是從Java標(biāo)準(zhǔn)異常體系中衍生特定的classes, 那么,捕捉異常的人便可以捕捉特定異常,之后才捕捉基本異常。如果你加入新的衍生異常,原有的客戶端程序仍能通過(guò)其基礎(chǔ)型別來(lái)捕捉它。
23. 有時(shí)候簡(jiǎn)單的聚合()就夠了。
飛機(jī)上的”旅客舒適系統(tǒng)”包括數(shù)個(gè)分離的元素:座椅、空調(diào)、視訊設(shè)備等等,你會(huì)需要在飛機(jī)上產(chǎn)生許多這樣的東西。你會(huì)將它們聲明為Private成員并開(kāi)發(fā)出一個(gè)全新的接口嗎?不會(huì)的,在這個(gè)例子中,元素也是Public接口的一部分,所以仍然是安全的。當(dāng)然啦,簡(jiǎn)單聚合并不是一個(gè)常被運(yùn)用的解法,但有時(shí)候的確是。
24. 試著從客戶程序員和程序維護(hù)的角度思考。
你的class應(yīng)該設(shè)計(jì)得盡可能容易使用。你應(yīng)該預(yù)先考量可能性有的變動(dòng),并針對(duì)這些 可能的變動(dòng)進(jìn)行設(shè)計(jì),使這些變動(dòng)日后可輕易完成。
25. 小心”巨大對(duì)象并發(fā)癥”。
這往往是剛踏OOP領(lǐng)域的過(guò)程式()程序員的一個(gè)苦惱,因?yàn)樗麄兺罱K還是寫(xiě)出一個(gè)過(guò)程式程序,并將它們擺放到一個(gè)或兩個(gè)巨大對(duì)象中。注意,除了 framework (應(yīng)用程序框架,譯注:一種很特殊的、大型OO程序庫(kù),幫你架構(gòu)程序本體)之外,對(duì)象代表的是程序中的觀念,而不是程序本身。
26. 如果你得用某種丑陋的方式來(lái)達(dá)成某個(gè)動(dòng)作,請(qǐng)將丑陋的部分局限在某個(gè)class里頭。
27. 如果你得用某種不可移植方式來(lái)達(dá)成某個(gè)動(dòng)作,請(qǐng)將它抽象化并局限于某個(gè)class里頭。這樣一個(gè)”額外間接層”能夠防止不可移植的部分?jǐn)U散到整個(gè)程序。這種作法的具體呈現(xiàn)便是Bridge設(shè)計(jì)模式(design pattern)。
28. 對(duì)象不應(yīng)僅僅只用來(lái)持有數(shù)據(jù)。
對(duì)象也應(yīng)該具有定義明確界限清楚的行為。有時(shí)候使用”數(shù)據(jù)對(duì)象”是適當(dāng)?shù)?,但只有在通用形容器不適用時(shí),才適合刻意以數(shù)據(jù)對(duì)象來(lái)包裝、傳輸一群數(shù)據(jù)項(xiàng)。
29. 欲從既有的classes身上產(chǎn)生新的classes時(shí),請(qǐng)以組合()為優(yōu)先考量。
你應(yīng)該只在必要時(shí)才使用繼承。如果在組合適用之處你卻選擇了繼承,你的設(shè)計(jì)就滲雜了非必要的復(fù)雜性。
30. 運(yùn)用繼承和函數(shù)覆寫(xiě)機(jī)制來(lái)展現(xiàn)行為上的差異,運(yùn)用fields(數(shù)據(jù)成員)來(lái)展現(xiàn)狀態(tài)上的差異。
這句話的極端例子,就是繼承出不同的classes表現(xiàn)各種不同的顏色,而不使用”color”field.
31. 當(dāng)心變異性(variance)。
語(yǔ)意相異的兩個(gè)對(duì)象擁有相同的動(dòng)作(或說(shuō)責(zé)任)是可能的。OO世界中存在著一種天生的引誘,讓人想要從某個(gè)class繼承出另一個(gè)subclass,為的是獲得繼承帶來(lái)的福利。這便是所謂”變異性”。但是,沒(méi)有任何正當(dāng)理由足以讓我們強(qiáng)迫制造出某個(gè)其實(shí)并不存在的/subclass關(guān)系。比較好的解決方式是寫(xiě)出一個(gè)共用的base class,它為兩個(gè)derived classes制作出共用接口–這種方式會(huì)耗用更多空間,但你可以如你所盼望地從繼承機(jī)制獲得好處,而且或許能夠在設(shè)計(jì)上獲得重大發(fā)現(xiàn)。
32. 注意繼承上的限制。
最清晰易懂的設(shè)計(jì)是將功能加到繼承得來(lái)的class里頭;繼承過(guò)程中拿掉舊功能(而非增加新功能)則是一種可疑的設(shè)計(jì)。不過(guò),規(guī)則可以打破。如果你所處理的是舊有的class程序庫(kù),那么在某個(gè)class的subclass限制功能,可能會(huì)比重新制定整個(gè)結(jié)構(gòu)(俾使新class得以良好地相稱(chēng)于舊 class)有效率得多。
33. 使用設(shè)計(jì)模式(design patterns)來(lái)減少”赤裸裸無(wú)加掩飾的機(jī)能(naked )”。
舉個(gè)例子,如果你的class只應(yīng)該產(chǎn)出惟一一個(gè)對(duì)象,那么請(qǐng)不要以加思索毫無(wú)設(shè)計(jì)的手法來(lái)完成它,然后撰寫(xiě)”只該產(chǎn)生一份對(duì)象”這樣的注解就拍拍屁股走人。請(qǐng)將它包裝成singleton(譯注:一個(gè)有名的設(shè)計(jì)模式,可譯為”單件”)。如果主程序中有多而混亂的”用以產(chǎn)生對(duì)象”的程序代碼,請(qǐng)找出類(lèi)似 factory method這樣的生成模式( patterns),使價(jià)錢(qián)可用以封裝生成動(dòng)作減少”赤裸裸無(wú)加掩飾的機(jī)能”(naked )不僅可以讓你的程序更易理解和維護(hù),也可以阻止出于好意卻帶來(lái)意外的維護(hù)者。
34. 當(dāng)心”因分析而導(dǎo)致的癱瘓(analysis paralysis)”。
請(qǐng)記住,你往往必須在獲得所有信息之前讓項(xiàng)目繼續(xù)前進(jìn)。而且理解未知部分的*也最快的方式,通常就是實(shí)際前進(jìn)一步而不只是紙上談兵。除非找到解決辦法,否則無(wú)法知道解決辦法。Java擁有內(nèi)置的防火墻,請(qǐng)讓它們發(fā)揮作用。你在單一class或一組classes中所犯的錯(cuò)誤,并不會(huì)傷害整個(gè)系統(tǒng)的完整性。
35. 當(dāng)你認(rèn)為你已經(jīng)獲得一份優(yōu)秀的分析、設(shè)計(jì)或?qū)崿F(xiàn)時(shí),請(qǐng)?jiān)囍右匝菥殹?br>將團(tuán)隊(duì)以外的某些人帶進(jìn)來(lái)-他不必非得是個(gè)顧問(wèn)不可,他可以是公司其他團(tuán)隊(duì)的成員。請(qǐng)那個(gè)人以新鮮的姿態(tài)審視你們的成果,這樣可以在尚可輕易修改的階段找出問(wèn)題,其收獲會(huì)比因演練而付出的時(shí)間和金錢(qián)代價(jià)來(lái)得高。實(shí)現(xiàn) ()
36. 一般來(lái)說(shuō),請(qǐng)遵守Sun的程序編寫(xiě)習(xí)慣。
價(jià)錢(qián)可以在以下網(wǎng)址找到相關(guān)文檔:java.sun.com/docs/codeconv/idex.html。本書(shū)盡可能遵守這些習(xí)慣。眾多Java程序員看到的程序代碼,都有是由這些習(xí)慣構(gòu)成的。如果你固執(zhí)地停留在過(guò)去的編寫(xiě)風(fēng)格中,你的(程序代碼)讀者會(huì)比較辛苦。不論你決定采用什么編寫(xiě)習(xí)慣,請(qǐng)?jiān)谡麄€(gè)程序中保持一致。你可以在home.wtal.de/software-solutions/jindent上找到一個(gè)用來(lái)重排Java程序的免費(fèi)工具。
37. 無(wú)論使用何種編寫(xiě)風(fēng)格,如果你的團(tuán)隊(duì)(或整個(gè)公司,那就更好了)能夠加以標(biāo)準(zhǔn)化,那么的確會(huì)帶來(lái)顯著效果。這代表每個(gè)人都可以在其他人不遵守編寫(xiě)風(fēng)格修改其作品,這是個(gè)公平的游戲。標(biāo)準(zhǔn)化的價(jià)值在于,分析程序代碼時(shí)所花的腦力較小,因而可以專(zhuān)心于程序代碼的實(shí)質(zhì)意義。
38. 遵守標(biāo)準(zhǔn)的大小寫(xiě)規(guī)范。
將 class名稱(chēng)的*個(gè)字母應(yīng)為大寫(xiě)。數(shù)據(jù)成員、函數(shù)、對(duì)象()的*個(gè)字母應(yīng)為小寫(xiě)。所有識(shí)別名稱(chēng)的每個(gè)字都應(yīng)該連在一塊兒,所有非首字的*個(gè)字母都應(yīng)該大寫(xiě)。例如: 如果你在static final 基本型別的定義處指定了常量初始式(constant ),那么該識(shí)別名稱(chēng)應(yīng)該全為大寫(xiě),代表一個(gè)編譯期常量。 Packages是個(gè)特例,其名稱(chēng)皆為小寫(xiě),即使非首字的字母亦是如此。域名(org, net, edu 等等)皆應(yīng)為小寫(xiě)。(這是Java 1.1遷移至Java 2時(shí)的一項(xiàng)改變) 。
39、不要自己發(fā)明”裝飾用的”P(pán)rivate數(shù)據(jù)成員名稱(chēng)。
通常這種的形式是在最前端加上底線和其他字符,匈牙利命名法(Hungarian notation)是其中最差的示范。在這種命名法中,你得加入額外字符來(lái)表示數(shù)據(jù)的型別、用途、位置等等。仿佛你用的是匯編語(yǔ)言(assembly language)而編譯器沒(méi)有提供任何協(xié)肋似的。這樣的命名方式容易讓人混淆又難以閱讀,也不易推行和維護(hù)。就讓classes和packages來(lái)進(jìn)行”名稱(chēng)上的范
圍制定(name scoping)”吧。
40、當(dāng)你擬定通用性的class時(shí),請(qǐng)遵守正規(guī)形式(canonical form)。
包括equals( )、hashCode( )、clone( ) ( 實(shí)現(xiàn)出Cloneable),并實(shí)現(xiàn)出和等等。
41、對(duì)于那些”取得或改變Private數(shù)據(jù)值”的函數(shù),請(qǐng)使用Java Beans 的”get”、”set”、”is”等命名習(xí)慣,即使你當(dāng)時(shí)不認(rèn)為自己正在撰寫(xiě)Java Bean。這么做不僅可以輕易以Bean的運(yùn)用方式來(lái)運(yùn)用你的class,也是對(duì)此類(lèi)函數(shù)的一種標(biāo)準(zhǔn)命名方式,使讀者更易于理解。
42、對(duì)于你所擬定的每一個(gè)class,請(qǐng)考慮為它加入static public test( ),其中含有class功能測(cè)試碼。
你不需要移除該測(cè)試就可將程序納入項(xiàng)目。而且如果有所變動(dòng),你可以輕易重新執(zhí)行測(cè)試。這段程序代碼也可以做為class的使用示例。
43、有時(shí)候你需要通過(guò)繼承,才得以訪問(wèn)base class的protected成員。
這可能會(huì)引發(fā)對(duì)多重基類(lèi)(multiple base types)的認(rèn)識(shí)需求。如果你不需要向上轉(zhuǎn)型,你可以先衍生新的class發(fā)便執(zhí)行protected訪問(wèn)動(dòng)作,然后在”需要用到上述 protected成員”的所有classes中,將新class聲明為成員對(duì)象,而非直接繼承。
44、避免純粹為了效率考量而使用final函數(shù)。
只有在程序能動(dòng)但執(zhí)行不夠快時(shí),而且效能量測(cè)工具(profiler)顯示某個(gè)函數(shù)的調(diào)用動(dòng)作成為瓶頸時(shí),才使用final函數(shù)。
45、如果兩個(gè)classes因某種功能性原因而產(chǎn)生了關(guān)聯(lián)(例如容器和迭代器iterators),那么請(qǐng)?jiān)囍屍渲心硞€(gè)class成為另一個(gè)class 的內(nèi)隱類(lèi)(inner class)。
這不僅強(qiáng)調(diào)二者間的關(guān)聯(lián),也是通過(guò)”將class名稱(chēng)嵌套置于另一個(gè)class 內(nèi)”而使同一個(gè)class 名稱(chēng)在單一Package中可被重復(fù)使用。Java 容器庫(kù)在每個(gè)容器類(lèi)中都定義了一個(gè)內(nèi)隱的(inner)Iterator class,因而能夠提供容器一份共通接口。運(yùn)用內(nèi)隱類(lèi)的另一個(gè)原因是讓它成為private實(shí)現(xiàn)物的一部分。在這里,內(nèi)隱類(lèi)會(huì)為信息隱藏帶來(lái)好處,而不是對(duì)上述的class關(guān)聯(lián)性提供肋益,也不是為了防止命名空間污染問(wèn)題(namespace pollution)。
46、任何時(shí)候你都要注意那些高度耦合(coupling)的 classes.請(qǐng)考慮內(nèi)隱類(lèi)(inner classes)為程序擬定和維護(hù)帶來(lái)的好處。內(nèi)隱類(lèi)的使用并不是要去除classes間的耦合,而是要讓耦合關(guān)系更明顯也更便利。
47、不要成為”過(guò)早*化”的犧牲品。
那會(huì)讓人神經(jīng)錯(cuò)亂。尤其在系統(tǒng)建構(gòu)初期,先別煩惱究竟要不要撰寫(xiě)(或避免)原生函數(shù)(native methods)、要不要將某些數(shù)聲明為final、要不要調(diào)校程序代碼效率等等。你的主要問(wèn)題應(yīng)該是先證明設(shè)計(jì)的正確性,除非設(shè)計(jì)本身需要某種程度的效率。
48、讓范圍(作用域,scope)盡可能愈小愈好,這么一來(lái)對(duì)象的可視范圍和壽命都將盡可能地小。
這種作法可降低”對(duì)象被用于錯(cuò)誤場(chǎng)所,因而隱藏難以察覺(jué)的臭蟲(chóng)”的機(jī)會(huì)。假設(shè)你有個(gè)容器,以及一段走訪該容器的程序片段。如果你復(fù)制該段程序代碼,將它用于新的容器身上,你可能會(huì)不小心以舊容器的大小做為新容器的走訪上限值。如果舊容器已不在訪問(wèn)范圍內(nèi),那么編譯期便可找出這樣的錯(cuò)誤。
49、使用Java 標(biāo)準(zhǔn)程序庫(kù)提供的容器。
請(qǐng)熟悉他們的用法。你將因此大幅提升你的生產(chǎn)力。請(qǐng)優(yōu)先選擇ArrayList來(lái)處理序列(sequences),選擇HashSet來(lái)處理集合(sets)、選擇HashMap來(lái)處理關(guān)聯(lián)式數(shù)組( arrays),選擇 (而不是Stack) 來(lái)處理 shacks和queues。
50、對(duì)一個(gè)強(qiáng)固的(robust)程序而言,每一個(gè)組成都必須強(qiáng)固。
請(qǐng)?jiān)谀闼珜?xiě)的每個(gè)class中運(yùn)用Java 提供的所有強(qiáng)固提升工具:訪問(wèn)權(quán)限、異常、型別檢驗(yàn)等等。通過(guò)這種方式,你可以在建構(gòu)系統(tǒng)時(shí)安全地移往抽象化的下一個(gè)層次。
51、寧可在編譯期發(fā)生錯(cuò)誤,也不要在執(zhí)行期發(fā)生錯(cuò)誤。
試著在最靠近問(wèn)題發(fā)生點(diǎn)的地方處理問(wèn)題。請(qǐng)優(yōu)先在”擲出異常之處”處理問(wèn)題,并在擁有足夠信息以處理異常的最接近處理函數(shù)(handler)中捕捉異常。請(qǐng)進(jìn)行現(xiàn)階段你能夠?qū)υ摦惓K龅奶幚?;如果你無(wú)法解決問(wèn)題,應(yīng)該再次擲出異常。
52、當(dāng)心冗長(zhǎng)的函數(shù)定義。
函數(shù)應(yīng)該是一種簡(jiǎn)短的、”描述并實(shí)現(xiàn)class接口中某個(gè)可分離部分”的功能單元。過(guò)長(zhǎng)且復(fù)雜的函數(shù)不僅難以維護(hù),維護(hù)代價(jià)也高?;蛟S它嘗試做太多事情了。如果你發(fā)現(xiàn)這一類(lèi)函數(shù),代表它應(yīng)該被切割成多相函數(shù)。這種函數(shù)也提醒你或許得撰寫(xiě)新的class。小型函數(shù)同樣能夠在你的class中被重復(fù)運(yùn)用。(有時(shí)候函數(shù)必須很大才行,但它們應(yīng)該只做一件事情。)
53、盡可能保持”P(pán)rivate”。
一旦你對(duì)外公開(kāi)了程序庫(kù)的概況(method、Class 或field)。你便再也無(wú)法移除它們。因?yàn)槿绻瞥鼈?,便?huì)破壞某個(gè)現(xiàn)有的程序代碼,使得它們必須重新被編寫(xiě)或重新設(shè)計(jì)。如果你只公開(kāi)必要部分,那么你便可以改變其他東西而不造成傷害。設(shè)計(jì)總是會(huì)演化,所以這是個(gè)十分重要的自由度。通過(guò)這種方式,實(shí)現(xiàn)碼的更動(dòng)對(duì)derived class 造成的沖擊會(huì)降*。在多線程環(huán)境下,私密性格外重要-只有private數(shù)據(jù)可受保護(hù)而不被un-(未受同步控制)的運(yùn)用所破壞。
54、大量運(yùn)用注解,并使用javadoc的”注解文檔語(yǔ)法”來(lái)產(chǎn)生程序的說(shuō)明文檔。
不過(guò)注解應(yīng)該賦予程序代碼真正的意義;如果只是重申程序代碼已經(jīng)明確表示的內(nèi)容,那是很煩人的。請(qǐng)注意,通常Java class和其函數(shù)的名稱(chēng)都很長(zhǎng),為的便是降低注解量。
55、避免使用”魔術(shù)數(shù)字”,也就是那種寫(xiě)死在程序代碼里頭的數(shù)字–如果你想改變它們,它們就會(huì)成為你的惡夢(mèng),因?yàn)槟阌肋h(yuǎn)都沒(méi)有辦法知道”100″究竟代表” 數(shù)組大小”或其他東西。你應(yīng)該產(chǎn)生具描述性的常量度名稱(chēng),并在程序中使用該常量名稱(chēng)。這使程序更易于理解也更易于維護(hù)。
56、撰寫(xiě)構(gòu)造函數(shù)時(shí),請(qǐng)考慮異常狀態(tài)。*情境下,構(gòu)造函數(shù)不執(zhí)行任何會(huì)擲出異常的動(dòng)作。
次佳情境下,class 只繼承自(或合成自)強(qiáng)固的(robust)classes,所以如有任何異常被擲出,并不需要清理。其他情況下,你就得在finally子句清理合成后的classes。如果某個(gè)構(gòu)造函數(shù)一定會(huì)失敗,適當(dāng)?shù)膭?dòng)作就是擲出異常,使調(diào)用者不至于盲目認(rèn)為對(duì)象已被正確產(chǎn)生而繼續(xù)執(zhí)行。
57、如果你的class需要在”客戶程序員用完對(duì)象”后進(jìn)行清理動(dòng)作,請(qǐng)將清理動(dòng)作,放到單一而定義明確的函數(shù)中。*令其名稱(chēng)為cleanup() 以便能夠?qū)⒂猛靖嬖V他人。此外請(qǐng)將boolean旗標(biāo)放到class中,用以代表對(duì)象是否已被清理,使finalize()得以檢驗(yàn)其死亡條件(請(qǐng)參考第 4章)。
58、finalize() 只可用于對(duì)象死亡條件的檢驗(yàn)(請(qǐng)參考4章),俾有益于調(diào)試。
特殊情況下可能需要釋放一些不會(huì)被垃圾回收的內(nèi)存。因?yàn)槔厥掌骺赡懿粫?huì)被喚起處理你的對(duì)象,所以你無(wú)法使用finalize()執(zhí)行必要的清理動(dòng)作?;谶@個(gè)原因,你得擬定自己的”清理用”函數(shù)。在class finalize()中,請(qǐng)檢查確認(rèn)對(duì)象的確已被清理,并在對(duì)象尚未被清理時(shí),擲出衍生自Runtime Exception 的異常。使用這種架構(gòu)前,請(qǐng)先確認(rèn)finalize()在你的系統(tǒng)上可正常動(dòng)作(這可能需要調(diào)用System.gc()來(lái)確認(rèn))。
59、如果某個(gè)對(duì)象在某個(gè)特定范圍(scope)內(nèi)必須被清理(cleaned up),而不是被垃圾回收機(jī)制收回,請(qǐng)使用以下方法;將對(duì)象初始化,成功后立刻進(jìn)入擁有finally子句的一個(gè)try區(qū)段內(nèi)。Finally子句會(huì)引發(fā)清理動(dòng)作。
60、當(dāng)你在繼承過(guò)程中覆寫(xiě)了finalize(),請(qǐng)記得調(diào)用super. Finalize()。
但如果你的”直接上一層”是Object,,就不需要這個(gè)動(dòng)作。你應(yīng)該讓super.finalize() 成為被覆寫(xiě)()之finalize()的*一個(gè)動(dòng)作而不是*個(gè)動(dòng)作,用以確保base class的組件在你需要它們的時(shí)候仍然可用。
61、當(dāng)你撰寫(xiě)固定大小的對(duì)象容器,請(qǐng)將它們轉(zhuǎn)換為數(shù)組–尤其是從某個(gè)函數(shù)返回此一容器時(shí)。
通過(guò)這種方式,你可以獲得數(shù)組的”編譯期型別檢驗(yàn)”的好處,而且數(shù)組接收者可能不需要”先將數(shù)組中的對(duì)象加以轉(zhuǎn)型”便能加以使用。請(qǐng)注意,容器庫(kù)的base class (Java. Util. ) 具有兩個(gè)toArray(),能夠達(dá)到這個(gè)目的。
62、在interface(接口)和abstract class(抽象類(lèi))之間,優(yōu)先選擇前者。
如果你知道某些東西即將被設(shè)計(jì)為一個(gè)base class,你的*選擇應(yīng)該是讓它成為interface;只有在一定得放進(jìn)函數(shù)或數(shù)據(jù)成員時(shí),才應(yīng)該將它改為abstract class. Interface只和”客戶端想進(jìn)行什么動(dòng)作”有關(guān),class則比較把重心放在實(shí)現(xiàn)細(xì)節(jié)上。
63、在構(gòu)造函數(shù)中只做惟一必要?jiǎng)幼鳎簩?duì)象設(shè)定至適當(dāng)狀態(tài)。
避免調(diào)用其他函數(shù)(除了final函數(shù)),因?yàn)檫@些函數(shù)可能會(huì)被其他人覆寫(xiě)因而使你在建構(gòu)過(guò)程中得不可預(yù)期的結(jié)果(請(qǐng)參考第7章以取得更詳細(xì)的信息)。小型而簡(jiǎn)單的構(gòu)造函數(shù)比較不可能擲出異?;蛞l(fā)問(wèn)題。
64、為了避免一個(gè)十分令人泄氣的經(jīng)驗(yàn),請(qǐng)確認(rèn)你的classpath中的每個(gè)名稱(chēng),都只有一個(gè)未被放到packages里頭class。否則編譯器會(huì)先找到另一個(gè)名稱(chēng)相同的class,并回報(bào)錯(cuò)誤消息。如果你懷疑你的classpath出了問(wèn)題,試著從classpath中的每個(gè)起點(diǎn)查找同名的.class文件。*還是將所有classes都放到packages里頭。
65、留意一不小心犯下的重載()錯(cuò)誤。
如果你覆寫(xiě)base class 函數(shù)時(shí)沒(méi)有正確拼寫(xiě)其名稱(chēng),那么便會(huì)增加一個(gè)新的函數(shù),而不是覆寫(xiě)原有的函數(shù)。但是情況完全合法,所以你不會(huì)從編譯器或執(zhí)行期系統(tǒng)得到任何錯(cuò)誤消息–你的程序代碼只是無(wú)法正確作用,如此而已。
66、當(dāng)心過(guò)早*化。
先讓程序動(dòng)起來(lái),再讓它快–但只有在你必須(也就是說(shuō)只有在程序被證明在某段程序代碼上遭遇效能瓶頸)時(shí)才這么做。除非你已經(jīng)使用效能量測(cè)工具(profiler)找出瓶頸所在,否則你可能性只是在浪費(fèi)你的時(shí)間。效能調(diào)校的”隱藏成本”便是讓你的程序代碼變得更不可讀、更難維持。
67、記住,程序代碼被閱讀的時(shí)間多于它被撰寫(xiě)的時(shí)間。
清晰的設(shè)計(jì)能夠制作出去易懂的程序。注解、細(xì)節(jié)說(shuō)明、示例都是無(wú)價(jià)的。這些東西能夠幫助你和你的后繼者。如果沒(méi)有其他信息,那么Java 線上文檔找出一些有用的信息時(shí),你所遭遇的挫敗應(yīng)該足以讓你相信這一點(diǎn)。

溫馨提示:為不影響您的學(xué)業(yè),來(lái)校區(qū)前請(qǐng)先電話咨詢,方便我校安排相關(guān)的專(zhuān)業(yè)老師為您解答
相關(guān)資料
姓名不能為空
手機(jī)號(hào)格式錯(cuò)誤