版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Java開(kāi)發(fā)培訓(xùn)2013/02/17JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第1頁(yè)。主要內(nèi)容Java網(wǎng)絡(luò)開(kāi)發(fā)1JAVA常用開(kāi)發(fā)工具與技術(shù)2JAVA學(xué)習(xí)方向3EffectiveJava4JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第2頁(yè)。一.Java網(wǎng)絡(luò)開(kāi)發(fā)計(jì)算機(jī)網(wǎng)絡(luò)分層體系結(jié)構(gòu)套接字JavaWeb開(kāi)發(fā)JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第3頁(yè)。1.1計(jì)算機(jī)網(wǎng)絡(luò)分層體系結(jié)構(gòu)
計(jì)算機(jī)以一種非常簡(jiǎn)單的方式進(jìn)行相互間的操作和通信。計(jì)算機(jī)芯片是以1和0的形式存儲(chǔ)并傳輸數(shù)據(jù)的開(kāi)—閉轉(zhuǎn)換器的集合。當(dāng)計(jì)算機(jī)想共享數(shù)據(jù)時(shí),它們所需做的全部就是以一致的速度、順序、定時(shí)等等來(lái)回傳輸幾百萬(wàn)比特和字節(jié)的數(shù)據(jù)流。每次想在兩個(gè)應(yīng)用程序之間進(jìn)行信息通信時(shí),您怎么會(huì)愿意擔(dān)心那些細(xì)節(jié)呢? 為免除這些擔(dān)心,我們需要每次都以相同方式完成該項(xiàng)工作的一組包協(xié)議。這將允許我們處理應(yīng)用程序級(jí)的工作,而不必?fù)?dān)心低級(jí)網(wǎng)絡(luò)細(xì)節(jié)。這些成包協(xié)議稱為協(xié)議棧(stack)。TCP/IP是當(dāng)今最常見(jiàn)的協(xié)議棧。多數(shù)協(xié)議棧(包括TCP/IP)都大致對(duì)應(yīng)于國(guó)際標(biāo)準(zhǔn)化組織(InternationalStandardsOrganization,ISO)的開(kāi)放系統(tǒng)互連參考模型(OpenSystemsInterconnectReferenceModel,OSIRM)。OSIRM認(rèn)為在一個(gè)可靠的計(jì)算機(jī)組網(wǎng)中有七個(gè)邏輯層(見(jiàn)圖)。各個(gè)地方的公司都對(duì)這個(gè)模型某些層的實(shí)現(xiàn)做了一些貢獻(xiàn),從生成電子信號(hào)(光脈沖、射頻等等)到提供數(shù)據(jù)給應(yīng)用程序。TCP/IP映射到OSI模型中的兩層的情形如圖所示。我們不想涉及層的太多細(xì)節(jié),但您應(yīng)該知道套接字位于什么地方。JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第4頁(yè)。物理層:以太網(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ì)算機(jī)網(wǎng)絡(luò)協(xié)議JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第5頁(yè)。1.1TCP/IP體系分層JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第6頁(yè)。1.1TCP/IP體系分層JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第7頁(yè)。1.
2.套接字什么是套接字?
套接字是一種軟件抽象,用于表達(dá)兩臺(tái)機(jī)器之間的連接“終端”。對(duì)于一個(gè)給定的連接,每臺(tái)機(jī)器上都有一個(gè)套接字,您也可以想象它們之間有一條虛擬的“電纜”,“電纜”的每一端都插入到套接字中。當(dāng)然,機(jī)器之間的物理硬件和電纜連接都是完全未知的。抽象的全部目的是使我們無(wú)須知道不必知道的細(xì)節(jié)。
簡(jiǎn)言之,一臺(tái)機(jī)器上的套接字與另一臺(tái)機(jī)器上的套接字交談就創(chuàng)建一條通信通道。程序員可以用該通道來(lái)在兩臺(tái)機(jī)器之間發(fā)送數(shù)據(jù)。當(dāng)您發(fā)送數(shù)據(jù)時(shí),TCP/IP協(xié)議棧的每一層都會(huì)添加適當(dāng)?shù)膱?bào)頭信息來(lái)包裝數(shù)據(jù)。這些報(bào)頭幫助協(xié)議棧把您的數(shù)據(jù)送到目的地。好消息是Java語(yǔ)言通過(guò)"流"為您的代碼提供數(shù)據(jù),從而隱藏了所有這些細(xì)節(jié),這也是為什么它們有時(shí)候被做流套接字(streamingsocket)的原因。 把套接字想成兩端電話上的聽(tīng)筒—
我和您通過(guò)專用通道在我們的電話聽(tīng)筒上講話和聆聽(tīng)。直到我們決定掛斷電話,對(duì)話才會(huì)結(jié)束(除非我們?cè)谑褂梅涓C電話)。而且我們各自的電話線路都占線,直到我們掛斷電話。JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第8頁(yè)。1.
2.套接字套接字的類型
一般而言,Java語(yǔ)言中的套接字有以下兩種形式:TCP套接字(由Socket類實(shí)現(xiàn))UDP套接字(由DatagramSocket類實(shí)現(xiàn))
TCP和UDP扮演相同角色,但做法不同。兩者都接收傳輸協(xié)議數(shù)據(jù)包并將其內(nèi)容向前傳送到表示層。TCP把消息分解成數(shù)據(jù)包(數(shù)據(jù)報(bào),datagrams)并在接收端以正確的順序把它們重新裝配起來(lái)。TCP還處理對(duì)遺失數(shù)據(jù)包的重傳請(qǐng)求。有了TCP,位于上層的層要擔(dān)心的事情就少多了。UDP不提供裝配和重傳請(qǐng)求這些功能。它只是向前傳送信息包。位于上層的層必須確保消息是完整的并且是以正確的順序裝配的。 與TCP協(xié)議不同,用戶數(shù)據(jù)報(bào)協(xié)議(UDP)則是一種無(wú)連接的傳輸協(xié)議。利用UDP協(xié)議進(jìn)行數(shù)據(jù)傳輸時(shí),首先需要將要傳輸?shù)臄?shù)據(jù)定義成數(shù)據(jù)報(bào)(Datagram),在數(shù)據(jù)報(bào)中指明數(shù)據(jù)所要達(dá)到的端點(diǎn)(Socket,主機(jī)地址和端口號(hào)),然后再將數(shù)據(jù)報(bào)發(fā)送出去。這種傳輸方式是無(wú)序的,也不能確保絕對(duì)的安全可靠,但它很簡(jiǎn)單也具有比較高的效率,這與通過(guò)郵局發(fā)送郵件的情形非常相似。 一般而言,UDP強(qiáng)加給您的應(yīng)用程序的性能開(kāi)銷(xiāo)更小,但只在應(yīng)用程序不會(huì)突然交換大量數(shù)據(jù)并且不必裝配大量數(shù)據(jù)報(bào)以完成一條消息的時(shí)候。否則,TCP才是最簡(jiǎn)單或許也是最高效的選擇。JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第9頁(yè)。1.
2.套接字java平臺(tái)套接字實(shí)現(xiàn)URLConnectionSocketServerSocketJAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第10頁(yè)。1.3JavaWeb應(yīng)用的概念在Sun的JavaServlet規(guī)范中,對(duì)JavaWeb應(yīng)用作了這樣定義:“JavaWeb應(yīng)用由一組Servlet、HTML頁(yè)、類、以及其它可以被綁定的資源構(gòu)成。它可以在各種供應(yīng)商提供的實(shí)現(xiàn)Servlet規(guī)范的Servlet容器中運(yùn)行。”
JavaWeb應(yīng)用中可以包含如下內(nèi)容:ServletJSPjava實(shí)用類javabean靜態(tài)文檔如HTML、圖片等客戶端類(如Applet)描述Web應(yīng)用的信息(web.xml)JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第11頁(yè)。1.3.Servlet容器的概念Servlet容器為JavaWeb應(yīng)用提供運(yùn)行時(shí)環(huán)境,它負(fù)責(zé)管理Servlet和JSP的生命周期,以及管理它們的共享數(shù)據(jù)。Servlet容器也稱為JavaWeb應(yīng)用容器,或者Servlet/JSP容器。后文均采用Servlet容器的提法。目前最流行的Servlet容器軟件包括:TomcatJBossJ2EE服務(wù)器(如Weblogic)中也提供了內(nèi)置的Servlet容器JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第12頁(yè)。1.3.
Servlet容器響應(yīng)客戶請(qǐng)求的過(guò)程http://localhost:8080/szhhxh/hello?clientName=浩瀚
客戶Servlet容器Servlet請(qǐng)求HttpServletRequestHttpServletResponse響應(yīng)JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第13頁(yè)。1.3.
Servlet容器響應(yīng)客戶請(qǐng)求的過(guò)程當(dāng)客戶請(qǐng)求訪問(wèn)某個(gè)Servlet時(shí),Servlet容器將創(chuàng)建一個(gè)ServletRequest對(duì)象和ServletResponse對(duì)象。在ServletRequest對(duì)象中封裝了客戶請(qǐng)求信息,然后Servlet容器把ServletRequest對(duì)象和ServletResponse對(duì)象傳給客戶所請(qǐng)求的Servlet。Servlet把響應(yīng)結(jié)果寫(xiě)到ServletResponse中,然后由Servlet容器把響應(yīng)結(jié)果傳給客戶。
以下將簡(jiǎn)單介紹Java網(wǎng)絡(luò)開(kāi)發(fā)的原理及應(yīng)用JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第14頁(yè)。1.3HTTPWatchJAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第15頁(yè)。1.3.Tomcat原理一個(gè)web服務(wù)器也叫做HTTP服務(wù)器,因?yàn)樗褂肏TTP協(xié)議同客戶端(即瀏覽器)通信。一個(gè)基于Java的web服務(wù)器用到的兩個(gè)重要類:.Socket和.ServerSocket,通信協(xié)議采用HTTP。因此,很自然的接下來(lái)我們就以HTTP和java的這兩個(gè)類來(lái)談?wù)剋eb服務(wù)器。隨后我們?cè)俳榻B一個(gè)簡(jiǎn)單的web服務(wù)器應(yīng)用。JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第16頁(yè)。1.3.Tomcat原理Http是允許web服務(wù)端和瀏覽器之間通過(guò)Internet發(fā)送/接收的協(xié)議,它是一個(gè)請(qǐng)求/響應(yīng)的協(xié)議。瀏覽器請(qǐng)求一個(gè)文件,服務(wù)器會(huì)響應(yīng)這個(gè)請(qǐng)求。Http用Tcp連接方式默認(rèn)端口是80.Http的第一個(gè)發(fā)布版本是Http/0.9,目前一般用的是Http1.1.
通過(guò)Http協(xié)議,通常是瀏覽器通過(guò)建立連接并且發(fā)送請(qǐng)求來(lái)發(fā)起一個(gè)會(huì)話事務(wù),服務(wù)器端會(huì)響應(yīng)或者給瀏覽器一個(gè)響應(yīng)的連接,瀏覽器端或者服務(wù)器端可以在會(huì)話中提前終止一個(gè)連接。例如,當(dāng)用一個(gè)瀏覽器作為客戶端,可以點(diǎn)擊停止按鈕就可以終止正在下載的文件,從而有效的關(guān)閉與web服務(wù)器端的Http連接。JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第17頁(yè)。1.3.Tomcat原理一個(gè)Http請(qǐng)求包含以下3個(gè)部分:
·Method-URI-Protocal/Version
·Requestheaders
·Entitybody
一個(gè)HTTP請(qǐng)求的例子如下:
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ǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第18頁(yè)。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ǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第19頁(yè)。1.3.Tomcat原理PS:
瀏覽器、搶票軟件……JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第20頁(yè)。2.JAVA常用開(kāi)發(fā)工具與技術(shù)HTMLJSPjavascript標(biāo)簽技術(shù)(EXTJS、JSF等)JconsoleJ2EE其他開(kāi)發(fā)技術(shù)JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第21頁(yè)。2.1.HTML超文本標(biāo)記語(yǔ)言,即HTML(HypertextMarkupLanguage),是用于描述網(wǎng)頁(yè)文檔的一種標(biāo)記語(yǔ)言。JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第22頁(yè)。2.2.JSPJSP(JavaServerPages)是由SunMicrosystems公司倡導(dǎo)、許多公司參與一起建立的一種動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)標(biāo)準(zhǔn)。JSP技術(shù)有點(diǎn)類似ASP技術(shù),它是在傳統(tǒng)的網(wǎng)頁(yè)HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標(biāo)記(tag),從而形成JSP文件(*.jsp)。用JSP開(kāi)發(fā)的Web應(yīng)用是跨平臺(tái)的,既能在Linux下運(yùn)行,也能在其他操作系統(tǒng)上運(yùn)行。根據(jù)上面的JSP頁(yè)面工作原理圖,可以得到如下四個(gè)結(jié)論:1、JSP文件必須在JSP服務(wù)器內(nèi)運(yùn)行。2、JSP文件必須生成Servlet才能執(zhí)行。3、每個(gè)JSP頁(yè)面的第一個(gè)訪問(wèn)者速度很慢,因?yàn)楸仨毜却齁SP編譯成Servlet4、JSP頁(yè)面的訪問(wèn)者無(wú)須安裝任何客戶端,甚至不需要可以運(yùn)行Java的運(yùn)行環(huán)境,因?yàn)镴SP頁(yè)面輸送到客戶端的是標(biāo)準(zhǔn)HTML頁(yè)面。JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第23頁(yè)。2.3javascriptJavascript是一種由Netscape的LiveScript發(fā)展而來(lái)的原型化繼承的面向?qū)ο蟮膭?dòng)態(tài)類型的區(qū)分大小寫(xiě)的客戶端腳本語(yǔ)言,主要目的是為了解決服務(wù)器端語(yǔ)言,比如Perl,遺留的速度問(wèn)題,為客戶提供更流暢的瀏覽效果。當(dāng)時(shí)服務(wù)端需要對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證,由于網(wǎng)絡(luò)速度相當(dāng)緩慢,只有28.8kbps,驗(yàn)證步驟浪費(fèi)的時(shí)間太多。于是Netscape的瀏覽器Navigator加入了Javascript,提供了數(shù)據(jù)驗(yàn)證的基本功能。JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第24頁(yè)。2.4.標(biāo)簽技術(shù)1.使用標(biāo)簽
<cc:showUserInfouser="${pageScope.userinfo}"/>2.實(shí)現(xiàn)Tag接口,可以直接繼承實(shí)現(xiàn)了此接口的TagSupport類,覆蓋doStartTag()方法,以out.println(“****”)形式輸出3.在Web-Inf創(chuàng)建標(biāo)簽庫(kù)描述文件.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ǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第25頁(yè)。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為判斷有問(wèn)題的實(shí)例的http端口號(hào)UserName:輸入adminPassword:輸入adminJAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第26頁(yè)。2.6.J2EE其他開(kāi)發(fā)技術(shù)JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第27頁(yè)。3.JAVA編程基礎(chǔ)JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第28頁(yè)。3.JAVA網(wǎng)絡(luò)開(kāi)發(fā)JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第29頁(yè)。3.JAVA高級(jí)編程JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第30頁(yè)。3.JAVA應(yīng)用框架JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第31頁(yè)。3.JAVA系統(tǒng)框架JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第32頁(yè)。4.1考慮用靜態(tài)工廠方法替代構(gòu)造器publicstaticBooleanvalueOf(booleanb){ return(b?Boolean.TRUE:Boolean.FALSE);}
優(yōu)點(diǎn):1.名字可不與類名相同,可以采用更易理解的名稱。2.不必在每次調(diào)用的時(shí)候都創(chuàng)建一個(gè)新的對(duì)象。3.可以返回子類型。缺點(diǎn):1.無(wú)法被繼承。2.和其它static方法無(wú)法區(qū)分。JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第33頁(yè)。應(yīng)用場(chǎng)景:
沿海地產(chǎn)財(cái)務(wù)憑證WebService接口開(kāi)發(fā),該財(cái)務(wù)接口高峰時(shí)每秒調(diào)用6~10次。問(wèn)題描述:
生產(chǎn)機(jī)服務(wù)器每隔兩到三天憑證接口調(diào)用就開(kāi)始超時(shí),查看服務(wù)器沒(méi)有內(nèi)存溢出,高峰值內(nèi)存占用為70~80%,后臺(tái)沒(méi)有抱錯(cuò),服務(wù)器實(shí)例必須重啟后才能使用。部分代碼具體:
修改前:
publiccalssVoucherServiceImpl{publicstaticvoidcreateVoucher(Stringxml,Contextctx){ …… IYHVoucherFacadeiYHVoucherFacade=
YHVoucherFacadeFactory.getLocalInstance(ctx); VoucherInfovoucherInfo=newVoucherInfo(); ……//業(yè)務(wù)邏輯處理 iYHVoucherFacade.save(voucherInfo);}}4.1考慮用靜態(tài)工廠方法替代構(gòu)造器JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第34頁(yè)。修改后: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ǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第35頁(yè)。4.2遇到多個(gè)構(gòu)造器參數(shù)時(shí)要考慮用構(gòu)造器2.1重疊構(gòu)造器 NutritionFactsCocaCola=newNutritionFacts(240,8,100,35,27);
缺點(diǎn):當(dāng)有許多參數(shù)的時(shí)候,客戶端代碼會(huì)很難寫(xiě)。2.2JavaBean模式NutritionFactsCocaCola=newNutritionFacts();CocaCola.setServingSize(240);……缺點(diǎn):構(gòu)造過(guò)程被分解到幾個(gè)調(diào)用過(guò)程中,在構(gòu)造過(guò)程中JavaBean可能存于不一致的狀態(tài)。JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第36頁(yè)。4.2遇到多個(gè)構(gòu)造器參數(shù)時(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)點(diǎn):可以有多個(gè)可變(varargs)參數(shù)。
缺點(diǎn):為了創(chuàng)建對(duì)象,必須先創(chuàng)建它的構(gòu)造器,可能存在一定性能問(wèn)題,必須先初始化。JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第37頁(yè)。4.3用私有構(gòu)造器或者枚舉類型強(qiáng)化Singleton屬性3.1公有靜態(tài)成員是個(gè)final域:publicclassHello{publicstaticfinalHelloInstance=newHell();privateHello(){}}3.2公有的成員是個(gè)靜態(tài)工廠方法:publicclassHello{privatestaticfinalHelloInstance=newHell();privateHello(){}publicstaticHellogetInstance(){//可以方便改變r(jià)eturnInstance;}privateObjectreadResolve(){//防止反序列話時(shí)創(chuàng)建一個(gè)新的實(shí)例
returnINSTANCE;}}
如果想讓singleton類成為serializable,除了implementsSerializable外,還要提供readResolve()方法返回該單例。JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第38頁(yè)。4.4避免創(chuàng)建不必要的對(duì)象
尤其是創(chuàng)建比較昂貴的。對(duì)不可修改的對(duì)象盡量進(jìn)行復(fù)用,這樣效率和性能都會(huì)提高。例如如果循環(huán)100次Strings=newString("hello")將創(chuàng)建100個(gè)對(duì)象循環(huán)100次Strings="hello";則只創(chuàng)建了一個(gè)對(duì)象。很好的進(jìn)行了復(fù)用。以下代碼是否有問(wèn)題,為什么。publicstaticvoidmain(String[]args){Longsum=0L;for(longi=0;i<Integer.MAX_VALUE;i++){sum+=I;}System.out.println(sum);}JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第39頁(yè)。4.5消除過(guò)期的對(duì)象引用內(nèi)存泄漏,在cache里易發(fā)生。以下兩個(gè)代碼之間有什么問(wèn)題:publicObjectpop(){if(size==0){}returnelements[size--];}publicObjectpop(){if(size==0){}Objectobj=elements[--size];elements[size]=null;//但是不要濫用,不要每個(gè)對(duì)象使用后都用NULLreturnobj;}如果一個(gè)棧顯示增長(zhǎng),然后再收縮,那么,從堆棧中彈出來(lái)的對(duì)象將不會(huì)被當(dāng)作垃圾回收,即使使用棧的程序不在引用這些對(duì)象,他們也不會(huì)被回收。這是因?yàn)闂?nèi)部維護(hù)著對(duì)這些對(duì)象的過(guò)期引用。過(guò)期引用是指永遠(yuǎn)也不會(huì)再被解除的引用。JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第40頁(yè)。4.6使類和成員的可訪問(wèn)范圍降到最低好的模塊設(shè)計(jì)應(yīng)該盡最大可能封裝好自己的內(nèi)部信息,這樣可以把模塊之間的耦合程度降到最低。開(kāi)發(fā)得以并行,無(wú)疑這將加快開(kāi)發(fā)的速度,便于系統(tǒng)地維護(hù)。Java中通過(guò)訪問(wèn)控制符來(lái)解決這個(gè)問(wèn)題。public表示這個(gè)類在任何范圍都可用。Protected表示只有子類和包內(nèi)的類可以使用private-package(default)表示在包內(nèi)可用private表示只有類內(nèi)才可以用你在設(shè)計(jì)一個(gè)類的時(shí)候應(yīng)該盡量的按照4321得順序設(shè)計(jì)。假如一個(gè)類只是被另一個(gè)類使用,那么應(yīng)該考慮把它設(shè)計(jì)成這個(gè)類的內(nèi)部類。通常public的類不應(yīng)該有public得字段,不過(guò)我們通常會(huì)用一個(gè)類來(lái)定義所有的常量,這是答應(yīng)的。不過(guò)必須保證這些字段要么是基本數(shù)據(jù)類型要么引用指向的對(duì)象是不可修改的。不然他們將可能被修改。例如下面的定義中data就是不合理的,后面兩個(gè)沒(méi)有問(wèn)題。
publicclassCon
{
publicstaticfinalint[]data={1,2,3};//itisbad
publicstaticfinalStringhello="world";
publicstaticfinalinti=1;JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第41頁(yè)。4.7在公有類中使用訪問(wèn)方法而非公有域classpoint{publicdoublex; publicdoubley;}該類的數(shù)據(jù)域是可以被直接訪問(wèn)的,這些類沒(méi)有提供封裝,如果不改變API,就無(wú)法改變它的數(shù)據(jù)表示法,也無(wú)法強(qiáng)加任何約束直接條件,當(dāng)域被訪問(wèn)的時(shí)候,無(wú)法采取任何輔助的行動(dòng)。所以應(yīng)該改為:
classpoint{privatedoublex; privatedoubley; publicvoidsetX(doublex){this.x=x;}……}總之,公有類永遠(yuǎn)都不應(yīng)該暴漏可變的域。雖然還是有幾個(gè)問(wèn)題,但是讓公有類暴漏不可變的域,起危害比較小。但是,有時(shí)候需要會(huì)用到包級(jí)私有的或者私有的嵌套類來(lái)暴漏域,無(wú)論這個(gè)類是可變還是不可變。JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第42頁(yè)。4.8不要忽略異常Exception處理的最佳實(shí)現(xiàn):
1.選擇Checked還是Unchecked的幾個(gè)經(jīng)典依據(jù)(如果你希望強(qiáng)制你的類調(diào)用者來(lái)處理異常,那么就用CheckedException;如果你不希望強(qiáng)制你的類調(diào)用者來(lái)處理異常,就用UnChecked。)
2.Exception的封裝問(wèn)題
3.如無(wú)必要不要?jiǎng)?chuàng)建自己得Exception
4.不要用Exception來(lái)作流程控制
5.不要輕易的忽略捕獲的Exception
6.不要簡(jiǎn)單地捕獲頂層的Exception”JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第43頁(yè)。4.9努力使失敗保持原子性一個(gè)失敗的方法調(diào)用,應(yīng)該是對(duì)象保持“它在被調(diào)用之前的狀態(tài)”。具有這種屬性的方法,被稱為具有失敗原子性。獲得這種效果的方法:1.設(shè)計(jì)一個(gè)非可變對(duì)象。2.對(duì)于可變對(duì)象,在操作之前檢查參數(shù)的有效性,在對(duì)象狀態(tài)改變之前,適當(dāng)?shù)膾伋霎惓?。與此類似,對(duì)計(jì)算處理過(guò)程順序調(diào)整,使得任何肯能會(huì)失敗的計(jì)算部分都發(fā)生在對(duì)象狀態(tài)被修改之前。3.編寫(xiě)恢復(fù)代碼(用于永久性的數(shù)據(jù)結(jié)構(gòu))。4.在對(duì)象的臨時(shí)拷貝上執(zhí)行操作,操作完成后,再把臨時(shí)拷貝中的結(jié)果,復(fù)制給原來(lái)的對(duì)象??偨Y(jié):失敗原子性是期望目標(biāo),但不總是能做到。對(duì)于某些操作,他會(huì)顯著的增加開(kāi)銷(xiāo)和復(fù)雜性??偨Y(jié)一條規(guī)則:作為方法規(guī)范的一部分,任何一個(gè)異常,都不應(yīng)該改變對(duì)象在調(diào)用這個(gè)方法之前的狀態(tài)。如果被改變,就該在API文檔中指明對(duì)象將處于什么樣的狀態(tài)。JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第44頁(yè)。4.10遵守普遍接受的命名慣例java的命名慣例分為兩大類:字面的和語(yǔ)法的。字面命名慣例涉及包、類、接口、方法和域。包的名字是層次結(jié)構(gòu)的,用句號(hào)分隔第一部分。每一部分的長(zhǎng)度不要超過(guò)8,由小寫(xiě)字母和數(shù)字組成(數(shù)字少見(jiàn)用),鼓勵(lì)使用有意義的縮寫(xiě)。除了java和javax外,一般以域名做開(kāi)頭,順序是頂級(jí)域名放在最前面。類和接口的名字應(yīng)至少1至多個(gè)單詞,每個(gè)單詞的首字母大寫(xiě)(駝峰試),盡量避免縮寫(xiě)。方法和域的名字與類和接口的名字遵守相同的字面慣例,只是第一個(gè)首字母要小寫(xiě)。常量域要全部字母都大寫(xiě),詞之間通過(guò)下劃線區(qū)分。語(yǔ)法命名慣例比字面慣例更靈活。類通常用一個(gè)名詞或名詞短語(yǔ),接口或者與類相同,或者以"-able"或"-ible"結(jié)尾的形容詞。
執(zhí)行某個(gè)動(dòng)作的方法,常用一個(gè)動(dòng)詞或動(dòng)詞短語(yǔ),
對(duì)于返回boolean類型的方法,名字常以“is"開(kāi)頭后加一個(gè)名詞或形容詞或短語(yǔ),
如果返回的不是boolean,則常用一個(gè)名詞/短語(yǔ),或以"get"開(kāi)頭的動(dòng)詞短語(yǔ)。
如果一方法所在的類是一個(gè)Bean,則強(qiáng)制要求以get開(kāi)頭。
如果類包含對(duì)屬性操作,常用setAttribute或getAttribute格式命名。轉(zhuǎn)換對(duì)象類型的方法,如果返回不同類型的獨(dú)立的對(duì)象,則稱為toType,個(gè)視圖,則用asType,如果返回與被調(diào)用對(duì)象同值的原語(yǔ)類型,稱為typeValue,靜態(tài)工廠的方法,常用valueOf或getInstance.
JAVA基礎(chǔ)開(kāi)發(fā)培訓(xùn)全文共50頁(yè),當(dāng)前為第45頁(yè)。4.11接口優(yōu)先于反射機(jī)制反射機(jī)制java.lang.reflect,提供了“通過(guò)程序來(lái)訪問(wèn)關(guān)于已裝載的類的信息”的能力。這些對(duì)象提供了“通過(guò)程序來(lái)訪問(wèn)類的成員名字、域類型、方法原型等信息”的能力。而且,Contructor、Method和Field實(shí)例使你能夠維護(hù)它們的底層對(duì)等體(“反射到底層”):通過(guò)調(diào)用Constructor、Method和Field實(shí)例上的方法,你可以構(gòu)造底層類的實(shí)例、調(diào)用底層類的方法、訪問(wèn)底層類中的域。
反射機(jī)制允許一個(gè)類使用另一個(gè)類,即使當(dāng)前者被編譯的時(shí)候后者還根本不存在。然而,這種能力也需要付出代價(jià):
1、你損失了編譯時(shí)類型檢查的好處,也包括異常檢查。如果一個(gè)程序企圖用反射方式調(diào)用一個(gè)不存在的方法,或者一個(gè)不可訪問(wèn)的方法,那么在運(yùn)行時(shí)刻它將會(huì)失敗,除非你采取了特別的預(yù)防措施。
2、要求執(zhí)行映像訪問(wèn)的代碼非常笨拙和冗長(zhǎng)。編寫(xiě)這樣的代碼非常乏味,閱讀這樣的代碼也很困難。
3、性能損失。
通常,普通應(yīng)用在運(yùn)行時(shí)不
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025湖南省安全員知識(shí)題庫(kù)
- 《醫(yī)院人力資源管理》課件
- 【大學(xué)課件】對(duì)國(guó)際貿(mào)易中文化差異的思考
- 小學(xué)硬筆書(shū)法教學(xué)課件
- 《鍛鍊正確判斷力》課件
- 公用事業(yè)行業(yè)十二月行業(yè)動(dòng)態(tài)報(bào)告:多地25年電力交易結(jié)果發(fā)布電價(jià)靴子落地
- 單位管理制度展示選集【人力資源管理篇】十篇
- 某河灘地人工濕地工程建設(shè)項(xiàng)目環(huán)境評(píng)估報(bào)告書(shū)
- REITs月報(bào):REITs二級(jí)市場(chǎng)震蕩上行常態(tài)化發(fā)行進(jìn)一步加速
- 單位管理制度收錄大全【人事管理篇】十篇
- 最敬業(yè)員工無(wú)記名投票選舉表
- 建設(shè)工程質(zhì)量檢測(cè)作業(yè)指導(dǎo)書(shū)+儀器設(shè)備操作規(guī)程2021版
- GA 1807-2022核技術(shù)利用單位反恐怖防范要求
- 梅毒診療指南(2014版)
- GA 172-2014金屬手銬
- 醫(yī)學(xué)醫(yī)學(xué)文獻(xiàn)檢索與論文寫(xiě)作培訓(xùn)課件
- 北師大版小學(xué)三年級(jí)數(shù)學(xué)下冊(cè)課件(全冊(cè))
- 工程臨時(shí)用工確認(rèn)單
- 簡(jiǎn)約清新大氣餐飲行業(yè)企業(yè)介紹模板課件
- 氮?dú)庵舷⑹鹿拾咐?jīng)驗(yàn)分享
- 某公司年度生產(chǎn)經(jīng)營(yíng)計(jì)劃書(shū)
評(píng)論
0/150
提交評(píng)論