JAVA基礎(chǔ)開發(fā)培訓(xùn)_第1頁
JAVA基礎(chǔ)開發(fā)培訓(xùn)_第2頁
JAVA基礎(chǔ)開發(fā)培訓(xùn)_第3頁
JAVA基礎(chǔ)開發(fā)培訓(xùn)_第4頁
JAVA基礎(chǔ)開發(fā)培訓(xùn)_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

Java開發(fā)培訓(xùn)2013/02/17JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第1頁。主要內(nèi)容Java網(wǎng)絡(luò)開發(fā)1JAVA常用開發(fā)工具與技術(shù)2JAVA學(xué)習(xí)方向3EffectiveJava4JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第2頁。一.Java網(wǎng)絡(luò)開發(fā)計算機(jī)網(wǎng)絡(luò)分層體系結(jié)構(gòu)套接字JavaWeb開發(fā)JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第3頁。1.1計算機(jī)網(wǎng)絡(luò)分層體系結(jié)構(gòu)

計算機(jī)以一種非常簡單的方式進(jìn)行相互間的操作和通信。計算機(jī)芯片是以1和0的形式存儲并傳輸數(shù)據(jù)的開—閉轉(zhuǎn)換器的集合。當(dāng)計算機(jī)想共享數(shù)據(jù)時,它們所需做的全部就是以一致的速度、順序、定時等等來回傳輸幾百萬比特和字節(jié)的數(shù)據(jù)流。每次想在兩個應(yīng)用程序之間進(jìn)行信息通信時,您怎么會愿意擔(dān)心那些細(xì)節(jié)呢? 為免除這些擔(dān)心,我們需要每次都以相同方式完成該項工作的一組包協(xié)議。這將允許我們處理應(yīng)用程序級的工作,而不必?fù)?dān)心低級網(wǎng)絡(luò)細(xì)節(jié)。這些成包協(xié)議稱為協(xié)議棧(stack)。TCP/IP是當(dāng)今最常見的協(xié)議棧。多數(shù)協(xié)議棧(包括TCP/IP)都大致對應(yīng)于國際標(biāo)準(zhǔn)化組織(InternationalStandardsOrganization,ISO)的開放系統(tǒng)互連參考模型(OpenSystemsInterconnectReferenceModel,OSIRM)。OSIRM認(rèn)為在一個可靠的計算機(jī)組網(wǎng)中有七個邏輯層(見圖)。各個地方的公司都對這個模型某些層的實現(xiàn)做了一些貢獻(xiàn),從生成電子信號(光脈沖、射頻等等)到提供數(shù)據(jù)給應(yīng)用程序。TCP/IP映射到OSI模型中的兩層的情形如圖所示。我們不想涉及層的太多細(xì)節(jié),但您應(yīng)該知道套接字位于什么地方。JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第4頁。物理層:以太網(wǎng)·調(diào)制解調(diào)器·電力線通信(PLC)·SONET/SDH·G.709·光導(dǎo)纖維·同軸電纜·雙絞線等數(shù)據(jù)鏈路層:Wi-Fi(IEEE802.11)·WiMAX(IEEE802.16)·ARP·RARP·ATM·DTM·令牌環(huán)·以太網(wǎng)·FDDI·幀中繼·GPRS·EVDO·HSPA·HDLC·PPP·L2TP·PPTP·ISDN·STP等網(wǎng)絡(luò)層協(xié)議:IP(IPv4·IPv6)·ICMP·ICMPv6·IGMP·IS-IS·IPsec等傳輸層協(xié)議:TCP·UDP·TLS·DCCP·SCTP·RSVP·OSPF等應(yīng)用層協(xié)議:DHCP·DNS·FTP·Gopher·HTTP·IMAP4·IRC·NNTP·XMPP·POP3·SIP·SMTP·SNMP·SSH·TELNET·RPC·RTCP·RTP·RTSP·SDP·SOAP·GTP·STUN·NTP·SSDP·BGP·RIP等1.1計算機(jī)網(wǎng)絡(luò)協(xié)議JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第5頁。1.1TCP/IP體系分層JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第6頁。1.1TCP/IP體系分層JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第7頁。1.

2.套接字什么是套接字?

套接字是一種軟件抽象,用于表達(dá)兩臺機(jī)器之間的連接“終端”。對于一個給定的連接,每臺機(jī)器上都有一個套接字,您也可以想象它們之間有一條虛擬的“電纜”,“電纜”的每一端都插入到套接字中。當(dāng)然,機(jī)器之間的物理硬件和電纜連接都是完全未知的。抽象的全部目的是使我們無須知道不必知道的細(xì)節(jié)。

簡言之,一臺機(jī)器上的套接字與另一臺機(jī)器上的套接字交談就創(chuàng)建一條通信通道。程序員可以用該通道來在兩臺機(jī)器之間發(fā)送數(shù)據(jù)。當(dāng)您發(fā)送數(shù)據(jù)時,TCP/IP協(xié)議棧的每一層都會添加適當(dāng)?shù)膱箢^信息來包裝數(shù)據(jù)。這些報頭幫助協(xié)議棧把您的數(shù)據(jù)送到目的地。好消息是Java語言通過"流"為您的代碼提供數(shù)據(jù),從而隱藏了所有這些細(xì)節(jié),這也是為什么它們有時候被做流套接字(streamingsocket)的原因。 把套接字想成兩端電話上的聽筒—

我和您通過專用通道在我們的電話聽筒上講話和聆聽。直到我們決定掛斷電話,對話才會結(jié)束(除非我們在使用蜂窩電話)。而且我們各自的電話線路都占線,直到我們掛斷電話。JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第8頁。1.

2.套接字套接字的類型

一般而言,Java語言中的套接字有以下兩種形式:TCP套接字(由Socket類實現(xiàn))UDP套接字(由DatagramSocket類實現(xiàn))

TCP和UDP扮演相同角色,但做法不同。兩者都接收傳輸協(xié)議數(shù)據(jù)包并將其內(nèi)容向前傳送到表示層。TCP把消息分解成數(shù)據(jù)包(數(shù)據(jù)報,datagrams)并在接收端以正確的順序把它們重新裝配起來。TCP還處理對遺失數(shù)據(jù)包的重傳請求。有了TCP,位于上層的層要擔(dān)心的事情就少多了。UDP不提供裝配和重傳請求這些功能。它只是向前傳送信息包。位于上層的層必須確保消息是完整的并且是以正確的順序裝配的。 與TCP協(xié)議不同,用戶數(shù)據(jù)報協(xié)議(UDP)則是一種無連接的傳輸協(xié)議。利用UDP協(xié)議進(jìn)行數(shù)據(jù)傳輸時,首先需要將要傳輸?shù)臄?shù)據(jù)定義成數(shù)據(jù)報(Datagram),在數(shù)據(jù)報中指明數(shù)據(jù)所要達(dá)到的端點(Socket,主機(jī)地址和端口號),然后再將數(shù)據(jù)報發(fā)送出去。這種傳輸方式是無序的,也不能確保絕對的安全可靠,但它很簡單也具有比較高的效率,這與通過郵局發(fā)送郵件的情形非常相似。 一般而言,UDP強(qiáng)加給您的應(yīng)用程序的性能開銷更小,但只在應(yīng)用程序不會突然交換大量數(shù)據(jù)并且不必裝配大量數(shù)據(jù)報以完成一條消息的時候。否則,TCP才是最簡單或許也是最高效的選擇。JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第9頁。1.

2.套接字java平臺套接字實現(xiàn)URLConnectionSocketServerSocketJAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第10頁。1.3JavaWeb應(yīng)用的概念在Sun的JavaServlet規(guī)范中,對JavaWeb應(yīng)用作了這樣定義:“JavaWeb應(yīng)用由一組Servlet、HTML頁、類、以及其它可以被綁定的資源構(gòu)成。它可以在各種供應(yīng)商提供的實現(xiàn)Servlet規(guī)范的Servlet容器中運行?!?/p>

JavaWeb應(yīng)用中可以包含如下內(nèi)容:ServletJSPjava實用類javabean靜態(tài)文檔如HTML、圖片等客戶端類(如Applet)描述Web應(yīng)用的信息(web.xml)JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第11頁。1.3.Servlet容器的概念Servlet容器為JavaWeb應(yīng)用提供運行時環(huán)境,它負(fù)責(zé)管理Servlet和JSP的生命周期,以及管理它們的共享數(shù)據(jù)。Servlet容器也稱為JavaWeb應(yīng)用容器,或者Servlet/JSP容器。后文均采用Servlet容器的提法。目前最流行的Servlet容器軟件包括:TomcatJBossJ2EE服務(wù)器(如Weblogic)中也提供了內(nèi)置的Servlet容器JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第12頁。1.3.

Servlet容器響應(yīng)客戶請求的過程http://localhost:8080/szhhxh/hello?clientName=浩瀚

客戶Servlet容器Servlet請求HttpServletRequestHttpServletResponse響應(yīng)JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第13頁。1.3.

Servlet容器響應(yīng)客戶請求的過程當(dāng)客戶請求訪問某個Servlet時,Servlet容器將創(chuàng)建一個ServletRequest對象和ServletResponse對象。在ServletRequest對象中封裝了客戶請求信息,然后Servlet容器把ServletRequest對象和ServletResponse對象傳給客戶所請求的Servlet。Servlet把響應(yīng)結(jié)果寫到ServletResponse中,然后由Servlet容器把響應(yīng)結(jié)果傳給客戶。

以下將簡單介紹Java網(wǎng)絡(luò)開發(fā)的原理及應(yīng)用JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第14頁。1.3HTTPWatchJAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第15頁。1.3.Tomcat原理一個web服務(wù)器也叫做HTTP服務(wù)器,因為它使用HTTP協(xié)議同客戶端(即瀏覽器)通信。一個基于Java的web服務(wù)器用到的兩個重要類:.Socket和.ServerSocket,通信協(xié)議采用HTTP。因此,很自然的接下來我們就以HTTP和java的這兩個類來談?wù)剋eb服務(wù)器。隨后我們再介紹一個簡單的web服務(wù)器應(yīng)用。JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第16頁。1.3.Tomcat原理Http是允許web服務(wù)端和瀏覽器之間通過Internet發(fā)送/接收的協(xié)議,它是一個請求/響應(yīng)的協(xié)議。瀏覽器請求一個文件,服務(wù)器會響應(yīng)這個請求。Http用Tcp連接方式默認(rèn)端口是80.Http的第一個發(fā)布版本是Http/0.9,目前一般用的是Http1.1.

通過Http協(xié)議,通常是瀏覽器通過建立連接并且發(fā)送請求來發(fā)起一個會話事務(wù),服務(wù)器端會響應(yīng)或者給瀏覽器一個響應(yīng)的連接,瀏覽器端或者服務(wù)器端可以在會話中提前終止一個連接。例如,當(dāng)用一個瀏覽器作為客戶端,可以點擊停止按鈕就可以終止正在下載的文件,從而有效的關(guān)閉與web服務(wù)器端的Http連接。JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第17頁。1.3.Tomcat原理一個Http請求包含以下3個部分:

·Method-URI-Protocal/Version

·Requestheaders

·Entitybody

一個HTTP請求的例子如下:

POST/examples/default.jspHTTP/1.1

Accept:text/plain;text/html

Accept-Language:en-gb

Connection:Keep-Alive

Host:localhost

User-Agent:Mozilla/4.0(compatible;MSIE4.01;windows98)

Content-Length:33

Content-Type:application/x-www-form-urlencoded

Accept-Encoding:gzip,deflate

lastName=Franks&firstName=MichaelJAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第18頁。1.3.Tomcat原理HTTP/1.1200OK

Server:Microsoft-IIS/4.0

Date:Mon,5Jan200413:13:33GMT

Content-Type:text/html

Last-Modified:Mon,5Jan200413:13:12GMT

Content-Length:112

<html>

<head>

<title>HTTPResponseExample</title>

</head>

<body>

WelcometoBrainySoftware

</body>

</html>JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第19頁。1.3.Tomcat原理PS:

瀏覽器、搶票軟件……JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第20頁。2.JAVA常用開發(fā)工具與技術(shù)HTMLJSPjavascript標(biāo)簽技術(shù)(EXTJS、JSF等)JconsoleJ2EE其他開發(fā)技術(shù)JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第21頁。2.1.HTML超文本標(biāo)記語言,即HTML(HypertextMarkupLanguage),是用于描述網(wǎng)頁文檔的一種標(biāo)記語言。JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第22頁。2.2.JSPJSP(JavaServerPages)是由SunMicrosystems公司倡導(dǎo)、許多公司參與一起建立的一種動態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn)。JSP技術(shù)有點類似ASP技術(shù),它是在傳統(tǒng)的網(wǎng)頁HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標(biāo)記(tag),從而形成JSP文件(*.jsp)。用JSP開發(fā)的Web應(yīng)用是跨平臺的,既能在Linux下運行,也能在其他操作系統(tǒng)上運行。根據(jù)上面的JSP頁面工作原理圖,可以得到如下四個結(jié)論:1、JSP文件必須在JSP服務(wù)器內(nèi)運行。2、JSP文件必須生成Servlet才能執(zhí)行。3、每個JSP頁面的第一個訪問者速度很慢,因為必須等待JSP編譯成Servlet4、JSP頁面的訪問者無須安裝任何客戶端,甚至不需要可以運行Java的運行環(huán)境,因為JSP頁面輸送到客戶端的是標(biāo)準(zhǔn)HTML頁面。JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第23頁。2.3javascriptJavascript是一種由Netscape的LiveScript發(fā)展而來的原型化繼承的面向?qū)ο蟮膭討B(tài)類型的區(qū)分大小寫的客戶端腳本語言,主要目的是為了解決服務(wù)器端語言,比如Perl,遺留的速度問題,為客戶提供更流暢的瀏覽效果。當(dāng)時服務(wù)端需要對數(shù)據(jù)進(jìn)行驗證,由于網(wǎng)絡(luò)速度相當(dāng)緩慢,只有28.8kbps,驗證步驟浪費的時間太多。于是Netscape的瀏覽器Navigator加入了Javascript,提供了數(shù)據(jù)驗證的基本功能。JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第24頁。2.4.標(biāo)簽技術(shù)1.使用標(biāo)簽

<cc:showUserInfouser="${pageScope.userinfo}"/>2.實現(xiàn)Tag接口,可以直接繼承實現(xiàn)了此接口的TagSupport類,覆蓋doStartTag()方法,以out.println(“****”)形式輸出3.在Web-Inf創(chuàng)建標(biāo)簽庫描述文件.tdl(TagLibraryDescription).

<?xmlversion="1.0"encoding="UTF-8"?><taglibversion="2.0"xmlns="/xml/ns/j2ee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/j2eeweb-jsptaglibrary_2_0.xsd"><tlib-version>1.0</tlib-version><jsp-version>2.0</jsp-version><short-name>cc</short-name><uri>/mytaglib</uri><tag><name>showUserInfo</name><tag-class>com.mytags.UserInfoTag</tag-class><body-content>empty</body-content><attribute><name>user</name><required>false</required><rtexprvalue>true</rtexprvalue></attribute></tag></taglib>4.配置web.xml<jsp-config><taglib><taglib-uri>/mytaglib</taglib-uri><taglib-location>/WEB-INF/mytaglib.tld</taglib-location></taglib></jsp-config>JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第25頁。2.5.Jconsole在JMXURL:中輸入如下內(nèi)容:service:jmx:iiop:///jndi/corbaname::1.2@localhost:6888#jmx/rmi/RMIConnectorServer其中l(wèi)ocalhost為應(yīng)用服務(wù)器ip6888為判斷有問題的實例的http端口號UserName:輸入adminPassword:輸入adminJAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第26頁。2.6.J2EE其他開發(fā)技術(shù)JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第27頁。3.JAVA編程基礎(chǔ)JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第28頁。3.JAVA網(wǎng)絡(luò)開發(fā)JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第29頁。3.JAVA高級編程JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第30頁。3.JAVA應(yīng)用框架JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第31頁。3.JAVA系統(tǒng)框架JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第32頁。4.1考慮用靜態(tài)工廠方法替代構(gòu)造器publicstaticBooleanvalueOf(booleanb){ return(b?Boolean.TRUE:Boolean.FALSE);}

優(yōu)點:1.名字可不與類名相同,可以采用更易理解的名稱。2.不必在每次調(diào)用的時候都創(chuàng)建一個新的對象。3.可以返回子類型。缺點:1.無法被繼承。2.和其它static方法無法區(qū)分。JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第33頁。應(yīng)用場景:

沿海地產(chǎn)財務(wù)憑證WebService接口開發(fā),該財務(wù)接口高峰時每秒調(diào)用6~10次。問題描述:

生產(chǎn)機(jī)服務(wù)器每隔兩到三天憑證接口調(diào)用就開始超時,查看服務(wù)器沒有內(nèi)存溢出,高峰值內(nèi)存占用為70~80%,后臺沒有抱錯,服務(wù)器實例必須重啟后才能使用。部分代碼具體:

修改前:

publiccalssVoucherServiceImpl{publicstaticvoidcreateVoucher(Stringxml,Contextctx){ …… IYHVoucherFacadeiYHVoucherFacade=

YHVoucherFacadeFactory.getLocalInstance(ctx); VoucherInfovoucherInfo=newVoucherInfo(); ……//業(yè)務(wù)邏輯處理 iYHVoucherFacade.save(voucherInfo);}}4.1考慮用靜態(tài)工廠方法替代構(gòu)造器JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第34頁。修改后:publiccalssVoucherServiceImpl{ privateIYHVoucherFacadeiYHVoucherFacade=null; static{ iYHVoucherFacade =YHVoucherFacadeFactory.getLocalInstance(ctx);

}publicstaticvoidcreateVoucher(Stringxml,Contextctx){ …… VoucherInfovoucherInfo=newVoucherInfo(); ……//業(yè)務(wù)邏輯處理 iYHVoucherFacade.save(voucherInfo); } }4.1考慮用靜態(tài)工廠方法替代構(gòu)造器JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第35頁。4.2遇到多個構(gòu)造器參數(shù)時要考慮用構(gòu)造器2.1重疊構(gòu)造器 NutritionFactsCocaCola=newNutritionFacts(240,8,100,35,27);

缺點:當(dāng)有許多參數(shù)的時候,客戶端代碼會很難寫。2.2JavaBean模式NutritionFactsCocaCola=newNutritionFacts();CocaCola.setServingSize(240);……缺點:構(gòu)造過程被分解到幾個調(diào)用過程中,在構(gòu)造過程中JavaBean可能存于不一致的狀態(tài)。JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第36頁。4.2遇到多個構(gòu)造器參數(shù)時要考慮用構(gòu)造器2.3Builder模式publicstaticNutritionFacts{privatefinalintservingSize;……publicstaticclassBuilder{privatefinalintservingSize;privatefinalintservings; …… privateintcalories=0; …… publicBuilder(intservingSize,intservings){this.servingSize=servingSize; this.servings=servings;}}publicBuildercalories(intval){calories=val;returnthis;}public……publicNutritionFactsbuild(){ returnnewNutritionFacts(this);}}privateNutritionFacts(Builderbuilder){servingSize=builder.servingSize;……}}調(diào)用:NutritionFactscocaCola=newNutritionFacts.Builder(240,8).calories(100)……;

優(yōu)點:可以有多個可變(varargs)參數(shù)。

缺點:為了創(chuàng)建對象,必須先創(chuàng)建它的構(gòu)造器,可能存在一定性能問題,必須先初始化。JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第37頁。4.3用私有構(gòu)造器或者枚舉類型強(qiáng)化Singleton屬性3.1公有靜態(tài)成員是個final域:publicclassHello{publicstaticfinalHelloInstance=newHell();privateHello(){}}3.2公有的成員是個靜態(tài)工廠方法:publicclassHello{privatestaticfinalHelloInstance=newHell();privateHello(){}publicstaticHellogetInstance(){//可以方便改變returnInstance;}privateObjectreadResolve(){//防止反序列話時創(chuàng)建一個新的實例

returnINSTANCE;}}

如果想讓singleton類成為serializable,除了implementsSerializable外,還要提供readResolve()方法返回該單例。JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第38頁。4.4避免創(chuàng)建不必要的對象

尤其是創(chuàng)建比較昂貴的。對不可修改的對象盡量進(jìn)行復(fù)用,這樣效率和性能都會提高。例如如果循環(huán)100次Strings=newString("hello")將創(chuàng)建100個對象循環(huán)100次Strings="hello";則只創(chuàng)建了一個對象。很好的進(jìn)行了復(fù)用。以下代碼是否有問題,為什么。publicstaticvoidmain(String[]args){Longsum=0L;for(longi=0;i<Integer.MAX_VALUE;i++){sum+=I;}System.out.println(sum);}JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第39頁。4.5消除過期的對象引用內(nèi)存泄漏,在cache里易發(fā)生。以下兩個代碼之間有什么問題:publicObjectpop(){if(size==0){}returnelements[size--];}publicObjectpop(){if(size==0){}Objectobj=elements[--size];elements[size]=null;//但是不要濫用,不要每個對象使用后都用NULLreturnobj;}如果一個棧顯示增長,然后再收縮,那么,從堆棧中彈出來的對象將不會被當(dāng)作垃圾回收,即使使用棧的程序不在引用這些對象,他們也不會被回收。這是因為棧內(nèi)部維護(hù)著對這些對象的過期引用。過期引用是指永遠(yuǎn)也不會再被解除的引用。JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第40頁。4.6使類和成員的可訪問范圍降到最低好的模塊設(shè)計應(yīng)該盡最大可能封裝好自己的內(nèi)部信息,這樣可以把模塊之間的耦合程度降到最低。開發(fā)得以并行,無疑這將加快開發(fā)的速度,便于系統(tǒng)地維護(hù)。Java中通過訪問控制符來解決這個問題。public表示這個類在任何范圍都可用。Protected表示只有子類和包內(nèi)的類可以使用private-package(default)表示在包內(nèi)可用private表示只有類內(nèi)才可以用你在設(shè)計一個類的時候應(yīng)該盡量的按照4321得順序設(shè)計。假如一個類只是被另一個類使用,那么應(yīng)該考慮把它設(shè)計成這個類的內(nèi)部類。通常public的類不應(yīng)該有public得字段,不過我們通常會用一個類來定義所有的常量,這是答應(yīng)的。不過必須保證這些字段要么是基本數(shù)據(jù)類型要么引用指向的對象是不可修改的。不然他們將可能被修改。例如下面的定義中data就是不合理的,后面兩個沒有問題。

publicclassCon

{

publicstaticfinalint[]data={1,2,3};//itisbad

publicstaticfinalStringhello="world";

publicstaticfinalinti=1;JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第41頁。4.7在公有類中使用訪問方法而非公有域classpoint{publicdoublex; publicdoubley;}該類的數(shù)據(jù)域是可以被直接訪問的,這些類沒有提供封裝,如果不改變API,就無法改變它的數(shù)據(jù)表示法,也無法強(qiáng)加任何約束直接條件,當(dāng)域被訪問的時候,無法采取任何輔助的行動。所以應(yīng)該改為:

classpoint{privatedoublex; privatedoubley; publicvoidsetX(doublex){this.x=x;}……}總之,公有類永遠(yuǎn)都不應(yīng)該暴漏可變的域。雖然還是有幾個問題,但是讓公有類暴漏不可變的域,起危害比較小。但是,有時候需要會用到包級私有的或者私有的嵌套類來暴漏域,無論這個類是可變還是不可變。JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第42頁。4.8不要忽略異常Exception處理的最佳實現(xiàn):

1.選擇Checked還是Unchecked的幾個經(jīng)典依據(jù)(如果你希望強(qiáng)制你的類調(diào)用者來處理異常,那么就用CheckedException;如果你不希望強(qiáng)制你的類調(diào)用者來處理異常,就用UnChecked。)

2.Exception的封裝問題

3.如無必要不要創(chuàng)建自己得Exception

4.不要用Exception來作流程控制

5.不要輕易的忽略捕獲的Exception

6.不要簡單地捕獲頂層的Exception”JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第43頁。4.9努力使失敗保持原子性一個失敗的方法調(diào)用,應(yīng)該是對象保持“它在被調(diào)用之前的狀態(tài)”。具有這種屬性的方法,被稱為具有失敗原子性。獲得這種效果的方法:1.設(shè)計一個非可變對象。2.對于可變對象,在操作之前檢查參數(shù)的有效性,在對象狀態(tài)改變之前,適當(dāng)?shù)膾伋霎惓?。與此類似,對計算處理過程順序調(diào)整,使得任何肯能會失敗的計算部分都發(fā)生在對象狀態(tài)被修改之前。3.編寫恢復(fù)代碼(用于永久性的數(shù)據(jù)結(jié)構(gòu))。4.在對象的臨時拷貝上執(zhí)行操作,操作完成后,再把臨時拷貝中的結(jié)果,復(fù)制給原來的對象??偨Y(jié):失敗原子性是期望目標(biāo),但不總是能做到。對于某些操作,他會顯著的增加開銷和復(fù)雜性??偨Y(jié)一條規(guī)則:作為方法規(guī)范的一部分,任何一個異常,都不應(yīng)該改變對象在調(diào)用這個方法之前的狀態(tài)。如果被改變,就該在API文檔中指明對象將處于什么樣的狀態(tài)。JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第44頁。4.10遵守普遍接受的命名慣例java的命名慣例分為兩大類:字面的和語法的。字面命名慣例涉及包、類、接口、方法和域。包的名字是層次結(jié)構(gòu)的,用句號分隔第一部分。每一部分的長度不要超過8,由小寫字母和數(shù)字組成(數(shù)字少見用),鼓勵使用有意義的縮寫。除了java和javax外,一般以域名做開頭,順序是頂級域名放在最前面。類和接口的名字應(yīng)至少1至多個單詞,每個單詞的首字母大寫(駝峰試),盡量避免縮寫。方法和域的名字與類和接口的名字遵守相同的字面慣例,只是第一個首字母要小寫。常量域要全部字母都大寫,詞之間通過下劃線區(qū)分。語法命名慣例比字面慣例更靈活。類通常用一個名詞或名詞短語,接口或者與類相同,或者以"-able"或"-ible"結(jié)尾的形容詞。

執(zhí)行某個動作的方法,常用一個動詞或動詞短語,

對于返回boolean類型的方法,名字常以“is"開頭后加一個名詞或形容詞或短語,

如果返回的不是boolean,則常用一個名詞/短語,或以"get"開頭的動詞短語。

如果一方法所在的類是一個Bean,則強(qiáng)制要求以get開頭。

如果類包含對屬性操作,常用setAttribute或getAttribute格式命名。轉(zhuǎn)換對象類型的方法,如果返回不同類型的獨立的對象,則稱為toType,個視圖,則用asType,如果返回與被調(diào)用對象同值的原語類型,稱為typeValue,靜態(tài)工廠的方法,常用valueOf或getInstance.

JAVA基礎(chǔ)開發(fā)培訓(xùn)全文共50頁,當(dāng)前為第45頁。4.11接口優(yōu)先于反射機(jī)制反射機(jī)制java.lang.reflect,提供了“通過程序來訪問關(guān)于已裝載的類的信息”的能力。這些對象提供了“通過程序來訪問類的成員名字、域類型、方法原型等信息”的能力。而且,Contructor、Method和Field實例使你能夠維護(hù)它們的底層對等體(“反射到底層”):通過調(diào)用Constructor、Method和Field實例上的方法,你可以構(gòu)造底層類的實例、調(diào)用底層類的方法、訪問底層類中的域。

反射機(jī)制允許一個類使用另一個類,即使當(dāng)前者被編譯的時候后者還根本不存在。然而,這種能力也需要付出代價:

1、你損失了編譯時類型檢查的好處,也包括異常檢查。如果一個程序企圖用反射方式調(diào)用一個不存在的方法,或者一個不可訪問的方法,那么在運行時刻它將會失敗,除非你采取了特別的預(yù)防措施。

2、要求執(zhí)行映像訪問的代碼非常笨拙和冗長。編寫這樣的代碼非常乏味,閱讀這樣的代碼也很困難。

3、性能損失。

通常,普通應(yīng)用在運行時不

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論