簡介
Java,是由Sun Microsystems公司於1995年5月推出的Java程式設計語言和Java平台的總稱。用Java實現的HotJava瀏覽器(支持Java applet)顯示了Java的魅力:跨平台、動態的Web、Internet計算。從此,Java被廣泛接受並推動了Web的迅速發展,常用的瀏覽器現均支持Java applet
平台
Java平台由Java虛擬機(Java Virtual Machine)和Java 套用編程接口(Application Programming Interface、簡稱API)構成。Java 套用編程接口為Java套用提供了一個獨立於作業系統的標準接口,可分為基本部分和擴展部分。在硬體或作業系統平台上安裝一個Java平台之後,Java應用程式就可運行。現Java平台已經嵌入了幾乎所有的作業系統。這樣Java程式可以只編譯一次,就可以在各種系統中運行。Java套用編程接口已經從1.1x版發展到1.2版。現常用的Java平台基於Java1.7,最近版本為Java1.8。
Java分為三個體系JavaSE(Java2 Platform Standard Edition,java平台標準版),JavaEE(Java 2 Platform,Enterprise Edition,java平台企業版),JavaME(Java 2 Platform Micro Edition,java平台微型版)。
語言特點
Java是一種簡單的,面向對象的,分散式的,解釋型的,健壯安全的,結構中立的,可移植的,性能優異、多執行緒的動態語言。
當1995年SUN推出Java語言之後,全世界的目光都被這個神奇的語言所吸引。那么Java到底有何神奇之處呢?
Java語言其實最早誕生於1991年,起初被稱為OAK語言,是SUN公司為一些消費性電子產品而設計的一個通用環境。他們最初的目的只是為了開發一種獨立於平台的軟體技術,而且在網路出現之前,OAK可以說是默默無聞,甚至差點夭折。但是,網路的出現改變了OAK的命運。
在Java出現以前,Internet上的信息內容都是一些乏味死板的HTML文檔。這對於那些迷戀於WEB瀏覽的人們來說簡直不可容忍。他們迫切希望能在WEB中看到一些互動式的內容,開發人員也極希望能夠在WEB上創建一類無需考慮軟硬體平台就可以執行的應用程式,當然這些程式還要有極大的安全保障。對於用戶的這種要求,傳統的程式語言顯得無能為力。SUN的工程師敏銳地察覺到了這一點,從1994年起,他們開始將OAK技術套用於WEB上,並且開發出了HotJava的第一個版本。當SUN公司1995年正式以Java這個名字推出的時候,幾乎所有的WEB開發人員都心生感嘆:噢,這正是我想要的!於是Java成了一顆耀眼的明星,醜小鴨一下子變成了白天鵝。
學習
Java是個平台,我只想說說我對學好Java的一點看法,希望對初學者有所幫助。
1. 思考一下
學習Java之前,先別急,靜下心來好好想想:
1)你對學習Java是否有興趣?
2)你是否能靜下心來堅持不懈地學習?
嗯,這是個容易但又絕對不應該忽略的問題,你確信自己對Java感興趣、而且又有吃苦的準備,那你才可能學好Java!如果具備這兩點條件,就請繼續往下看……
2. 準備一下
請不要把你的學習Java之路和其它計算機技術分開看待,技術的聯繫往往是千絲萬縷的,你應該掌握一些學習Java所涉及的基礎知識,對於“CLASSPATH要怎么設定啊”、“跪求JDK下載地址”等等問題,你不該問,因為Internet上太多答案了,甚至換個角度說,你是不是還不適合直接學習編程?
1)買本Java學習用書。
JDK 6正式版剛剛推出,市面上你暫時買不到JDK6的書籍,但我仍推薦你買一本適合入門的、較新JDK版本的Java書籍,那么,你現在選擇一本講述JDK5的入門書籍還是有條件的。我可以推薦一些入門書,但是我不打算這么做,因為合我口味的,不一定適合你。但無論如何,《Thinking In Java》絕對不應該作為你入門Java的第一本書籍!
記住,網路上學習Java的資源很多,但基本不夠系統,擁有一本Java入門書籍,是你系統學習Java的基礎。
2)準備Java學習環境。
準備你的學習環境,很簡單,安裝JDK6,然後用類似UltraEdit、EditPlus的文本編輯器配置你的學習環境,Internet上有很多關於如何配置的文章。初學Java,不建議用IDE工具,通過一行行的敲代碼,你會碰到很多問題,只有這樣,你才能學會怎樣解決問題,並加深自己對Java的理解。
準備好後,開始進入激動人心的Java學習里程吧!
3. Java基礎學習之路
學習Java的過程雖然辛苦些,但又是處處有精彩!學習過程中的心態一定要保持專一,網上關於語言間的“PK”到處都是,別被浮躁影響!認準了Java,你就堅持!克服心魔,恆心最終會給你回報的。
Java的體系分為Java SE、Java EE和Java ME(JDK 5.0以前分別叫J2SE、J2EE和J2ME),Java的敲門磚就是Java SE了,也就是你要入門學習的內容,不論你日後是選擇哪個體系領域作為發展方向,你都得從Java SE起步。
學習Java SE,打好Java基礎;如果想學Java EE(對不起,我不了解JavaME,所以我無法涉及JavaME的相關內容),對於AWT、Swing是否要學習呢,我個人是覺得還是要知道其所以然的,特別是其事件處理模式,我強烈建議初學者一定要弄清楚,其他具體的開發就不一定要全面掌握了,畢竟AWT、Swing方面的內容足夠用幾本大部頭的書才能描述詳盡;當然,如果你的工作就是做AWT、Swing開發,那就另當別論了。
l/o、Thread都是基礎之一。
4. Java EE學習之路
學習了Java SE,還只是完成“萬里長征”的第一步。
接下來選擇學習Java EE或是Java ME(或者你還想不斷深入學習JavaSE,只要你喜歡,你可以一直深入下去,就像前面所說的,我不會講到Java ME的學習);估計選擇Java EE方面的學習者會多一些,JavaEE所涉及技術非常多,考慮到初學者的接受程度,我會儘量從最常用的角度來介紹。
學習Java EE,在開發環境上不建議再用文本編輯器,我感覺NetBeans 5.5(目前最高正式版本)很適合初學者,我個人也很喜歡NetBeans,如果你喜歡用別的IDE如Eclipse,都沒問題,看自己喜歡吧。
4.1 學習JSP/Servlet
Java EE最高版本現是5.0版本。
在JavaEE中,首先要學習JSP/Servlet(結合Tomcat、MySQL)技術,建議JSP1.2/2.X的知識都要掌握,畢竟現很多的在用系統都還是基於JSP1.2,學習JSP,還必須掌握一些外延技術,如:你還得掌握HTML基礎知識,最好再掌握些JavaScript(現正火的AJAX技術之一)、CSS的技術,而了解XML是必不可少的(至少描述性配置信息是通過XML來描述的)。在學習JSP/Servlet過程中,應該結合學習JDBC、資料庫開發技術,畢竟絕大多數Java Web項目都是和資料庫緊密結合的。
4.2 學習資料庫開發技術
這裡我想重點說一下資料庫開發技術,資料庫技術是做業務系統必備技能,JavaWeb開發人員最低程度都應該掌握SQL語句的使用!資料庫技術大體可分為DBA技術和資料庫開發技術,對於開發而言,應側重資料庫開發技術,而資料庫基本操作,也是要掌握的。常用資料庫有DB2、Oracle、SQLServer、MySQL等,你可以結合實際需要,選擇一種資料庫,並花大力氣掌握其開發技術。
記住,學習資料庫開發技術和學習Java EE,是相對獨立的,你可以在學習JSP/Servlet的同時,學習資料庫開發技術(如SQL語句等),或者先學資料庫開發技術,之後再學習JSP/Servlet。
4.3 學習Java EE其它開發技術
再往後,可以學習一些EJB的知識,目前EJB最新版本是3.0,其和前面的2.X版本相比,有較大不同,考慮到現EJB2.X還有很大的套用市場,建議結合學習EJB 2.X/3.0。在學習EJB過程中,應同時掌握一種企業級套用伺服器的使用(如WebSphere、Weblogic、Sun Applcation Server或JBOSS等,現Sun Applcation Server9.X和JBOSS都可支持EJB 3.0)。
之後的學習中,再逐漸擴展到其他Java EE技術。
5. 之後
等你對Java EE有些感悟的時候,你自然就會想不斷擴展你的知識面,這時候你可以學習Spring、Hibernate,以及各種Web框架(如Struts、JSF、Webwork或是Tapestry等)。
隨著技術、經驗的不斷積累,你會逐步關注分析、設計等更高層次的知識,這時候,你可進一步學習相關的UML、模式等知識(積累了一定經驗,你就可以安排自己學習這些知識了)。
6. 小結
永遠記住:自始至終,實踐是學習Java技術歷程中極其重要的一環。脫離了實踐,是學不好技術的!
Java學習、實踐之路依然沒有銀彈,況且一步步走來,要學的東西很多,勤奮是金!
善於利用Internet上眾多的資源,多吸取些別人的經驗。
首個程式
//檔案名稱HelloWorld.java
//聲明一個類
public class HelloWorld {
//聲明一個方法
public static void main(String args[]){ //程式的入口
//輸出
System.out.println(“hello world!”);
}
}
//例子
package Text;
public class Test{
public static void main(String args[]){
short d = 12; //短整型
System.out.println(d); //輸出d
long c = 144L; //長整型,要加l
System.out.println(c); //輸出c
int z = 15; //整型
System.out.println(z); //輸出z
char e = '我'; //字元型“我”
System.out.println(e);//輸出e
}
}
//無編譯工具 編譯運行java程式
//路徑是相對路徑
編譯java
javac[java源程式名稱。java] //一定要加上後綴名
//這個時候你會發現你的原程式旁邊多了一個.class檔案,檔案名稱和源檔案名稱稱相同
//有編譯錯誤會提示
運行java
java [java源程式名稱] //不需要加後綴名,自動運行。class檔案
//顯示程式運行結果
架構設計
軟體架構作為一個概念,體現在技術和業務兩個方面。
從技術角度來說:軟體架構隨著技術的革新不斷地更新其內容,軟體架構建立於當前技術和一些基本原則的基礎之上。
先說一些基本原則:
分層原則:分層是為了降低軟體深度複雜性而使用的關鍵思想,就像社會有了階級一樣,軟體有了層次結構。
模組化原則:模組化是化解軟體廣度複雜的必然手段,模組化的目的就是讓軟體分工。
接口實現分離原則隨著軟體模組化的不斷深入改進,面向接口編程而不是面向實現編程可以讓複雜度日趨增高的軟體降低模組之間的耦合度,從而讓各模組更輕鬆改進。從這個原則出發,軟體也從微觀進行了細緻的規範化。
還有兩個比較小但很重要的原則:
細節隱藏原則很顯然把複雜問題簡化,把難看的細節隱去,能讓軟體結構更清晰。其實這個原則使用很普遍,java/c++語言中的封裝原則以及設計模式中的Facade(外觀)模式就很能體現這個原則的精神。
依賴倒置原則隨著軟體結構的進一步發展,層與層之間、模組與模組之間的依賴逐漸加深,而層、模組的動態可插拔要求不端增大。依賴倒置原則可看視為接口實現分離原則的深化,根據此原則的精神,軟體進入了工具時代。這個原則有點類似於知名的好萊塢法則:Don't call us, we'll call you。
以上這些原則奠定了我們的軟體架構的價值指標。但軟體架構畢竟是建立在當前技術之上的。而每一代技術都有架構模式。過去的不再說了,讓我們就來看一下當前流行的技術,以及當前我們能採用的架構。
因為面向對象是當前最流行開發技術,且設計模式的大量使用使面向對象的走向成熟,而資料庫是當前最有效的存儲結構、web界面是當前最流行的用戶接口,所以當前最典型的三層次架構就架構在以上幾項技術的基礎之上,用資料庫作存儲層、用面向對象來實現業務層、用web來作為用戶接口層。我們從三層次架構談起:
因為面向對象技術和資料庫技術不適配,所以在標準三層次架構的基礎上,我們增加了數據持久層,來管理O-R雙向映射,但目前一直沒有最理想的實現技術。cmp和entity bean技術因為其實現複雜,功能前景有限,已接近被淘汰的邊緣。JDO及hibernate作為o-r映射的後期之秀,尤其是hibernate,功能相當完備。推薦作為持久層的首選
在業務層,因為當前業務日趨負載,且變動頻繁,所以我們必須有足夠敏捷的技術來保證我們的適應變化的能力,在標準j2ee系統中session bean負責業務處理,且有不錯的性能表現,但採用ejb系統對業務架構模式改變太大,且其複雜而昂貴,業務代碼移植性差。而spring 作為一個bean配置的輕量級架構,漂亮的IOC模式實現,對業務架構影響小,所以推薦作為中間層業務框架。
在用戶結構層,雖然servlet/jsp/jstl/javaBean 能夠實現MVC架構,但終究過於粗糙。struts對MVC架構的實現就比較完美,Taperstry也極好地實現MVC架構,且採用基於事件的方式,非常誘人,惜其不夠成熟,我們仍舊推薦struts作為用戶接口層基礎架構。
因為業務層是三層次架構中最有決定意義的,所以讓我們回到業務層細緻地分析一下,在複雜的業務我們常常需要以下基礎服務的一種或幾種:事務一致 性服務acid(tool:jta/jts)、並發加鎖服務concurrent&&lock、池化管理服務cache、訪問控制服務(tool:jaas)、流程控制服務workflow、動態實現服務IOC,串列化訊息服務(tool:jms)、負載平衡服務blance等。如果我們不採用重量級套用伺服器(如weblogic,websphere,jboss等)及重量級組件(EJB),我們必須自己實現其中一些服務。雖然我們大 多情況下,不需要所有這些服務,但實現起來卻非易事。幸運的是我們有大量的開源實現代碼,但採用開原始碼卻常常是件不輕鬆的事。
隨著xml作為結構化信息傳輸和存儲地位日漸重要,一些xml文檔操作工具(DOM,Digester,SAX等)的使用愈發重要,而隨著 xml schema的java binding工具(jaxb,xmlbean等)工具的成熟,採用xml schema來設計xml文檔格式,然後採用java binding來生成java bean 會成為主要編程模式,而這又進一步使數據中心向xml轉移,使在中小數據量上,愈發傾向於以xquery為查詢語言的xml資料庫。現還有一個趨勢, microsoft,ibm等紛紛大量開發中間軟體如(microsoft office之infopath),可以直接從xml schema 生成錄入頁面等非常實用的功能。還有web service 的廣泛套用,都將對軟體的架構有非常重大的影響。至於面向服務架構(SOA)前景如何,三層次架構什麼時候走入歷史,現還很難定論。
aop的發展也會對軟體架構有很深的影響,但在面向對象架構里,無論aspectJ還是jboss-aop抑是aspectWerks、 nanning都有其自身的嚴重問題:維護性很差,所以說它將很難走遠。也許作為一個很好的思想,它將在web service里大展身手。
rdf,owl作為w3c語義模型的標誌性的語言,也很難想像能在當前業務架構發揮太大影響。但如果真如它所聲稱那樣,廣泛地改變著信息的結構。那么對軟體架構也會有深遠影響。
開發技巧
Eclipse中最常用的快捷鍵:Ctrl+L Go to Line
F5 Step Into
Ctrl+H Open Search Dialog
Ctrl+Shift+K Find Previous
Ctrl+F11 Run
Ctrl+Shift+\ Remove Block Comment
F11 Debug
Ctrl+Shift+/Add Block Comment
Ctrl+K Find Next
F8 Resume (during Debug)
Ctrl+O Quick Outline
Alt+Shift+RRename (Refactoring)
F3 Open Declaration
Ctrl+R Run to Line
Ctrl+/ Toggle Comment
Ctrl+Shift+O Organize Imports
F6 Step Over
Ctrl+Shift+F Format
Ctrl+Shift+G References in Workspace
代碼規範
1、組織與風格
(1).關鍵字和操作符之間加適當的空格。
(2).相對獨立的程式塊與塊之間加空行
(3).較長的語句、表達式等要分成多行書寫。
(4).劃分出的新行要進行適應的縮進,使排版整齊,語句可讀。
(5).長表達式要在低優先權操作符處劃分新行,操作符放在新行之首。
(6).循環、判斷等語句中若有較長的表達式或語句,則要進行適應的劃分。
(7).若函式或過程中的參數較長,則要進行適當的劃分。
(8).不允許把多個短語句寫在一行中,即一行只寫一條語句。
(9).函式或過程的開始、結構的定義及循環、判斷等語句中的代碼都要採用縮進風格。
2、註解
Java 的語法與 C++ 及為相似,那么,你知道 Java 的注釋有幾種嗎?是兩種?
// 注釋一行
/* ...... */ 注釋若干行
不完全對,除了以上兩種之外,還有第三種,文檔注釋:
/** ...... */ 注釋若干行,並寫入 javadoc 文檔
注釋要簡單明了。
String userName = null; //用戶名
邊寫代碼邊注釋,修改代碼同時修改相應的注釋,以保證注釋與代碼的一致性。
在必要的地方注釋,注釋量要適中。注釋的內容要清楚、明了,含義準確,防止注釋二義性。
保持注釋與其描述的代碼相鄰,即注釋的就近原則。
對代碼的注釋應放在其上方相鄰位置,不可放在下面。對數據結構的注釋應放在其上方相鄰位置,不可放在下面;對結構中的每個域的注釋應放在此域的右方;
同一結構中不同域的注釋要對齊。
變數、常量的注釋應放在其上方相鄰位置或右方。
全局變數要有較詳細的注釋,包括對其功能、取值範圍、哪些函式或過程存取它以及存取時注意事項等的說明。
在每個源檔案的頭部要有必要的注釋信息,包括:檔案名稱;版本號;作者;生成日期;模組功能描述(如功能、主要算法、內部各部分之間的關係、該檔案與其它檔案關係等);主要函式或過程清單及本檔案歷史修改記錄等。
/**
* Copy Right Information : Neusoft IIT
* Project : eTrain
* JDK version used : jdk1.3.1
* Comments : config path
* Version : 1.01
* Modification history :2003.5.1
* Sr Date Modified By Why & What is modified
* 1. 2003.5.2 Kevin Gao new
**/
在每個函式或過程的前面要有必要的注釋信息,包括:函式或過程名稱;功能描述;輸入、輸出及返回值說明;調用關係及被調用關係說明等
/**
* Description :checkout 提款
* @param Hashtable cart info
* @param OrderBean order info
* @return String
*/
public String checkout(Hashtable htCart,
OrderBean orderBean)
throws Exception{
}
javadoc注釋標籤語法
@author 對類的說明 標明開發該類模組的作者
@version 對類的說明 標明該類模組的版本
@see 對類、屬性、方法的說明 參考轉向,也就是相關主題
@param 對方法的說明 對方法中某參數的說明
@return 對方法的說明 對方法返回值的說明
@exception 對方法的說明 對方法可能拋出的異常進行說明
3、命名規範
定義這個規範的目的是讓項目中所有的文檔都看起來像一個人寫的,增加可讀性,減少項目組中因為換人而帶來的損失。(這些規範並不是一定要絕對遵守,但是一定要讓程式有良好的可讀性)較短的單詞可通過去掉"元音"形成縮寫;要不然最後自己寫的代碼自己都看不懂了,那可不行。
較長的單詞可取單詞的頭幾發符的優先權,並用括弧明確表達式的操作順序,避免使用默認優先權。
使用匈牙利表示法
Package 的命名
Package 的名字應該都是由一個小寫單詞組成。
package com.neu.util
Class 的命名
Class 的名字必須由大寫字母開頭而其他字母都小寫的單詞組成,對於所有標識符,其中包含的所有單詞都應緊靠在一起,而且大寫中間單詞的首字母。
public class ThisAClassName{}
Class 變數的命名
變數的名字必須用一個小寫字母開頭。後面的單詞用大寫字母開頭
userName , thisAClassMethod
Static Final 變數的命名
static Final 變數的名字應該都大寫,並且指出完整含義。
/**
*DBConfig PATH
**/
public static final String
DB_CONFIG_FILE_PATH ="com.neu.etrain.dbconfig";
參數的命名
參數的名字必須和變數的命名規範一致。
數組的命名
數組應該總是用下面的方式來命名:
byte[] buffer;
而不是:
byte buffer[];
方法的參數
使用有意義的參數命名,如果可能的話,使用和要賦值的欄位一樣的名字:
SetCounter(int size){
this.size = size;
}
4、檔案樣式
所有的 Java(*.java) 檔案都必須遵守如下的樣式規則:
版權資訊
版權資訊必須在 java 檔案的開頭,比如:
/*
* Copyright ? 2000 Shanghai XXX Co. Ltd.
* All right reserved.
*/
其他不需要出現在 javadoc 的信息也可以包含在這裡。
Package/Imports
package 行要在 import 行之前,import 中標準的包名要在本地的包名之前,而且按照字母
順序排列。如果 import 行中包含了同一個包中的不同子目錄,則應該用 * 來處理。
package hotlava.net.stats;
import java io.*;
import java.util.Observable;
import hotlava.util.Application;
這裡 java。io.* 使用來代替InputStream and OutputStream 的。
Class
接下來的是類的注釋,一般是用來解釋類的。
/**
* A class representing a set of packet and byte counters
* It is observable to allow it to be watched, but only
* reports changes when the current set is complete
*/
接下來是類定義,包含了在不同的行的 extends 和 implements
public class CounterSet
extends Observable
implements Cloneable
Class Fields
接下來是類的成員變數:
/**
* Packet counters
*/
protected int[] packets;
public 的成員變數必須生成文檔(JavaDoc)。proceted、private和 package 定義的成
員變數如果名字含義明確的話,可以沒有注釋。
存取方法
接下來是類變數的存取的方法。它只是簡單的用來將類的變數賦值獲取值的話,可以簡單的
寫在一行上。
/**
* Get the counters
* @return an array containing the statistical data. This array has been
* freshly allocated and can be modified by the caller.
*/
public int[] getPackets() { return copyArray(packets, offset); }
public int[] getBytes() { return copyArray(bytes, offset); }
public int[] getPackets() { return packets; }
public void setPackets(int[] packets) { this.packets = packets; }
其它的方法不要寫在一行上
構造函式
接下來是構造函式,它應該用遞增的方式寫(比如:參數多的寫在後面)。
訪問類型 ("public", "private" 等.) 和 任何 "static", "final" 或 "synchronized" 應該在一行
中,並且方法和參數另寫一行,這樣可以使方法和參數更易讀。
public
CounterSet(int size){
this.size = size;
}
克隆方法
如果這個類是可以被克隆的,那么下一步就是 clone 方法:
public
Object clone() {
try {
CounterSet obj = (CounterSet)super.clone();
obj.packets = (int[])packets.clone();
obj.size = size;
return obj;
}catch(CloneNotSupportedException e) {
throw new InternalError("Unexpected CloneNotSUpportedException: " +
e.getMessage());
}
}
類方法
下面開始寫類的方法:
/**
* Set the packet counters
* (such as when restoring from a database)
*/
protected final
void setArray(int[] r1, int[] r2, int[] r3, int[] r4)
throws IllegalArgumentException
{
//
// Ensure the arrays are of equal size
//
if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length)
throw new IllegalArgumentException("Arrays must be of the same size");
System.arraycopy(r1, 0, r3, 0, r1.length);
System.arraycopy(r2, 0, r4, 0, r1.length);
}
toString 方法
無論如何,每一個類都應該定義 toString 方法:
public
String toString() {
String retval = "CounterSet: ";
for (int i = 0; i < data.length(); i++) {
retval += data.bytes.toString();
retval += data.packets.toString();
}
return retval;
}
}
main 方法
如果main(String[]) 方法已經定義了, 那么它應該寫在類的底部.
5、代碼可讀性
避免使用不易理解的數字,用有意義的標識來替代。
不要使用難懂的技巧性很高的語句。
源程式中關係較為緊密的代碼應儘可能相鄰。
6、代碼性能
在寫代碼的時候,從頭至尾都應該考慮性能問題。這不是說時間都應該浪費在最佳化代碼上,而是我們時刻應該提醒自己要注意代碼的效率。比如:如果沒有時間來實現一個高效的算法,那么我們應該在文檔中記錄下來,以便在以後有空的時候再來實現她。
不是所有的人都同意在寫代碼的時候應該最佳化性能這個觀點的,他們認為性能最佳化的問題應該在項目的後期再去考慮,也就是在程式的輪廓已經實現了以後。
不必要的對象構造
不要在循環中構造和釋放對象
使用 StringBuffer 對象
在處理 String 的時候要儘量使用 StringBuffer 類,StringBuffer 類是構成 String 類的基礎。
String 類將 StringBuffer 類封裝了起來,(以花費更多時間為代價)為開發人員提供了一個安全的接口。當我們在構造字元串的時候,我們應該用 StringBuffer 來實現大部分的工作,當工作完成後將 StringBuffer 對象再轉換為需要的 String 對象。比如:如果有一個字元串必須不斷地在其後添加許多字元來完成構造,那么我們應該使用StringBuffer 對象和她的 append() 方法。如果我們用 String 對象代替StringBuffer 對象的話,會花費許多不必要的創建和釋放對象的 CPU 時間。
避免太多的使用 synchronized 關鍵字避免不必要的使用關鍵字 synchronized,應該在必要的時候再使用她,這是一個避免死鎖的好方法。
7、編程技巧
byte 數組轉換到 characters
為了將 byte 數組轉換到 characters,你可以這么做:
"Hello world!".getBytes();
Utility 類
Utility 類(僅僅提供方法的類)應該被申明為抽象的來防止被繼承或被初始化。
初始化
下面的代碼是一種很好的初始化數組的方法:
objectArguments = new Object[] { arguments };
枚舉類型
JAVA 對枚舉的支持不好,但是下面的代碼是一種很有用的模板:
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);
}
這種技術實現了RED, GREEN, BLUE 等可以象其他語言的枚舉類型一樣使用的常量。
他們可以用 '==" 操作符來比較。
但是這樣使用有一個缺陷:如果一個用戶用這樣的方法來創建顏色 BLACK new Colour(0,0,0)
那么這就是另外一個對象,"=="操作符就會產生錯誤。她的 equal() 方法仍然有效。由於這個原因,這個技術的缺陷最好註明在文檔中,或者只在自己的包中使用。
8、編寫格式
代碼樣式
代碼應該用 unix 的格式,而不是 windows 的(比如:回車變成回車+換行)
文檔化
必須用 javadoc 來為類生成文檔。不僅因為它是標準,這也是被各種 java 編譯器都認可的方法。使用 @author 標記是不被推薦的,因為代碼不應該是被個人擁有的。
縮進
縮進應該是每行2個空格. 不要在源檔案中保存Tab字元. 在使用不同的原始碼管理工具時Tab字元將因為用戶設定的不同而擴展為不同的寬度.如果你使用 UltrEdit 作為你的 Java 原始碼編輯器的話,你可以通過如下操作來禁止保存Tab字元, 方法是通過 UltrEdit中先設定 Tab 使用的長度室2個空格,然後用 Format|Tabs to Spaces 選單將 Tab 轉換為空格。
頁寬
頁寬應該設定為80字元. 原始碼一般不會超過這個寬度, 並導致無法完整顯示, 但這一設定也可以靈活調整. 在任何情況下, 超長的語句應該在一個逗號或者一個操作符後折行. 一條語句折行後, 應該比原來的語句再縮進2個字元.
{} 對
{} 中的語句應該單獨作為一行. 例如, 下面的第1行是錯誤的, 第2行是正確的:
if (i>0) { i ++ }; // 錯誤, { 和 } 在同一行
if (i>0) {
i ++
}; // 正確, { 單獨作為一行
} 語句永遠單獨作為一行.如果 } 語句應該縮進到與其相對應的 { 那一行相對齊的位置。
括弧
左括弧和後一個字元之間不應該出現空格, 同樣, 右括弧和前一個字元之間也不應該出現空格. 下面的例子說明括弧和空格的錯誤及正確使用:
CallProc( AParameter ); // 錯誤
CallProc(AParameter); // 正確
不要在語句中使用無意義的括弧. 括弧只應該為達到某種目的而出現在原始碼中。下面的例子說明錯誤和正確的用法:
if ((I) = 42) { // 錯誤 - 括弧毫無意義
if (I == 42) or (J == 42) then // 正確 - 的確需要括弧
9、代碼編譯
1.編寫代碼時要注意隨時保存,並定期備份,防止由於斷電、硬碟損壞等原因造成代碼丟失。
2.同一項目組內,最好使用相同的編輯器,並使用相同的設定選項。
3.合理地設計軟體系統目錄,方便開發人員使用。
4.打開編譯器的所有告警開關對程式進行編譯。
5.在同一項目組或產品組中,要統一編譯開關選項。
6.使用工具軟體(如Visual SourceSafe)對代碼版本進行維護。
10、可移植性
Borland Jbulider 不喜歡 synchronized 這個關鍵字,如果你的斷點設在這些關鍵字的作用域內的話,調試的時候你會發現的斷點會到處亂跳,讓你不知所措。除非必須,儘量不要使用。
換行
如果需要換行的話,儘量用 println 來代替在字元串中使用"\n"。
你不要這樣:
System.out.print("Hello,world!\n");
要這樣:
System.out.println("Hello,world!");
或者你構造一個帶換行符的字元串,至少要象這樣:
String newline = System.getProperty("line.separator");
System.out.println("Hello world" + newline);
PrintStream
PrintStream 已經被不贊成(deprecated)使用,用 PrintWrite 來代替它。