⑴ 使用java web開發的網站實例介紹
作為面試的話最好還是自己親自動手弄一下,要不面試官都是老油條,很容易看穿的。
⑵ javaweb 項目實例教程
項目教程的話應該沒有,,你可以去找你想做什麼項目的需求文檔和設計文檔,比如(oa需求設計文檔) 然後通過分析文檔,根據設計文檔去建立自己的項目
⑶ java web項目中的資料庫連接
把資料庫配置地址 換成你項目實際使用mysql的地址
,如果你使用了框架的話,只需要修改下資料庫連接的配置文件就可以 一般在propertiey或xml文件中
如果沒有,就是在實例化connection的時候 使用實際的資料庫地址 以及用戶名密碼
⑷ 一個成熟的javaWeb項目包含哪些層
一般是三層架構
表現層 web
業務層 service
持久層
⑸ 關於java如何做web應用程序開發,並給出一個的簡單的例子
你好。學習web需要准備的:
1、堅實的java基礎
2、tomcat伺服器
3、一定的html+css+javascript知識
4、servlet+jsp知識
5、模式1和模式2開發
把上面的都學好了,就可以做一個簡單的開發了。一個項目的代碼比較長,貼出來也沒有任何意義,如果樓主沒有上面的知識,有代碼也不能運行。所以建議你還是先學,慢慢練,很快就接觸到例子了。
⑹ JavaWeb核心框架的目錄
第1部分網頁開發技術
緒論JavaWeb分層設計與框架選型1
1.JavaWeb分層設計1
1.基本概念2.如何設計分層
3.JavaWeb分層設計:表現層、業務層、持久層
4.分層設計的優點
2.JavaWeb框架選型5
1.持久層框架:Hibernate、iBATIS
2.表現層框架:Struts1、Struts2
3.業務層框架:Spring
3.本書講解思路8
1.持久層2.表現層+持久層
3.業務層4.表現層+業務層+持久層
4.繼續下一課:准備篇10
第1部分准備篇
第1課構建Eclipse集成開發環境
1.1安裝JDK並進行配置和測試
1.1.1JDK的下載
1.1.2JDK的安裝
1.1.3設置環境變數
1.1.4測試Java環境
1.2安裝Tomcat並進行配置和測試
1.2.1Tomcat的下載
1.2.2Tomcat的安裝
1.2.3Tomcat的配置
1.2.4測試Tomcat
1.2.5配置一個站點並測試
1.3安裝Eclipse並進行配置
1.3.1Eclipse簡介
1.3.2Eclipse版本與代號
1.3.3Eclipse的下載
1.歷史下載頁面
2.專用下載頁面
3.默認下載頁面
1.3.4Eclipse的安裝
1.3.5Eclipse的啟動
1.3.6集成配置JDK
1.4使用Eclipse進行JavaWeb項目的開發-實例演示HelloWorld項目開發過程
1.4.1認識Eclipse工作區
1.4.2新建JavaWeb項目demo
1.4.3新建一個Java包test.hello
1.4.4新建一個Java類HelloWorld.java
1.4.5新建一個HTML頁面index.htm
1.4.6新建一個JSP頁面helloworld.jsp
1.4.7新建Tomcat伺服器集成配置
1.4.8運行項目查看結果
1.4.9Tomcat停止與重啟
1.4.10導出war部署包
1.4.11打包eclipse.zip
1.5本課小結
1.5.1總結本課的知識點
1.5.2要掌握的關鍵點
1.5.3繼續下一課:創建企業信息管理系統資料庫
第2課創建企業信息管理系統資料庫
2.1基本需求功能-登錄、退出與注冊
2.1.1基礎功能流程圖
2.1.2用戶登錄功能
2.1.3用戶退出功能
2.1.4用戶注冊功能
2.2業務需求功能-企業信息管理系統功能
2.2.1通訊錄管理模塊
2.2.2短消息管理模塊
2.2.3日程安排模塊
2.2.4工作記錄模塊
2.2.5公司公告模塊
2.2.6工作會議模塊
2.3設計頁面結構
2.3.1登錄界面
2.3.2登錄後的歡迎界面
2.3.3注冊界面
2.4設計資料庫
2.4.1資料庫需求分析
2.4.2設計數據表E-R圖
2.4.3設計數據表結構
2.5創建資料庫
2.5.1MySQL下載、安裝與啟動
1.下載MySQL2.安裝MySQL
3.MySQL的啟動與停止
4.MySQL服務的啟動與停止
2.5.2安裝MySQL客戶端軟體SQL-Front
2.5.3新建資料庫demo
2.5.4新建用戶表user
2.5.5添加一條用戶數據
2.5.6創建通訊錄管理表address
2.5.7創建短消息管理表sms
2.5.8創建日程安排表schele
2.5.9創建工作記錄表worklog
2.5.10創建公司公告表notice
2.5.11創建工作會議表meeting
2.5.12打包emis07(SQL+MySQL).zip
2.6本課小結
2.6.1總結本課的知識點
2.6.2要掌握的關鍵點
2.6.3繼續下一課:持久層框架Hibernate
第2部分持久層框架Hibernate
第3課Hibernate快速入門
3.1了解Hibernate基礎
3.1.1操作資料庫的3個階段
3.1.2ORM對象關系映射
3.1.3ORM持久層的概念
3.2Hibernate開發准備
3.2.1Hibernate開發流程
3.2.2Hibernate配置文件:properties和XML文件
3.2.3Hibernate下載與配置過程
3.2.4下載並添加MySQL驅動mysql-connector-java-5.0.8-bin.jar
3.3Hibernate快速上手-HibernateTest樣例
3.3.1添加Hibernate配置文件hibernate.cfg.xml
3.3.2編寫映射文件User.hbm.xml
3.3.3編寫持久化類User.java
3.3.4編寫輔助類HibernateSessionFactory.java
3.3.5編寫DAO類UserDAO.java
3.3.6編寫Service類UserService.java
3.3.7運行UserService.java查看結果
3.3.8打包HibernateTest.zip
3.4Hibernate自動生成工具
3.4.1自動生成工具MiddleGen
3.4.2Eclipse插件MiddleGenIDE
3.5本課小結
3.5.1總結本課的知識點
3.5.2要掌握的關鍵點
3.5.3課後上機作業
3.5.4繼續下一課:Hibernate核心技術
第4課Hibernate核心技術詳解
4.1Hibernate映射文件詳解
4.1.1根元素
4.1.2使用定義類
4.1.3使用定義主鍵
4.1.4使用設置主鍵生成方式
4.1.5Hibernate映射類型
4.1.6使用定義屬性
4.1.7使用配置多對一映射
4.1.8使用配置一對一映射
4.2Hibernate核心編程
4.2.1Hibernate核心類關系圖
4.2.2使用Configuration裝載配置
4.2.3使用SessionFactory創建Session
4.2.4使用Session操縱資料庫
4.2.5使用Transaction管理事務
4.3使用Query進行HQL語句查詢
4.3.1不帶參數的查詢
4.3.2帶參數的查詢
4.3.3取得List結果集
4.3.4取得迭代列表結果集
4.3.5取得一個對象
4.3.6標量查詢
4.3.7分頁查詢
4.3.8創建SQL查詢
4.4使用Criteria進行條件查詢
4.4.1創建Criteria實例
4.4.2添加查詢條件
4.4.3添加排序條件
4.4.4使用示例查詢
4.5本課小結
4.5.1總結本課的知識點
4.5.2要掌握的關鍵點
4.5.3繼續下一主題:Hibernate項目實戰-企業信息管理系統MySQL資料庫開發
第5課Hibernate項目實戰-企業信息管理系統MySQL資料庫開發
5.1導出映射文件和Domain層
5.1.1新建項目hibernatemysql
5.1.2使用MiddleGenIDE導出所有表的映射文件和Domain層
5.1.3修改導出文件
5.2開發用戶表user操作代碼
5.2.1開發DAO層代碼:UserDAO.java和UserDAOImpl.java
5.2.2開發Service層代碼:UserService.java和UserServiceImpl.java
5.2.3開發JUnit單元測試代碼:UserServiceTest.java
5.2.4運行單元測試類UserServiceTest.java
5.3開發通訊錄管理表address操作代碼
5.3.1開發分頁實體類Pager.java
5.3.2開發DAO代碼:AddressDAO.java和AddressDAOImpl.java
5.3.3開發Service代碼:AddressService.java和AddressServiceImpl.java
5.3.4開發單元測試代碼:AddressServiceTest.java
5.3.5運行單元測試類AddressServiceTest.java
5.4開發短消息管理表sms操作代碼
5.4.1開發DAO代碼:SmsDAO.java和SmsDAOImpl.java
5.4.2開發Service代碼:SmsService.java和SmsServiceImpl.java
5.4.3開發單元測試代碼:SmsServiceTest.java
5.4.4運行單元測試類SmsServiceTest.java
5.5開發日程安排表schele操作代碼
5.5.1開發DAO代碼:ScheleDAO.java和ScheleDAOImpl.java
5.5.2開發Service代碼:ScheleService.java和ScheleServiceImpl.java
5.5.3開發單元測試代碼:ScheleServiceTest.java
5.5.4運行單元測試類ScheleServiceTest.java
5.6開發工作日誌表worklog操作代碼
5.6.1開發DAO代碼:WorklogDAO.java和WorklogDAOImpl.java
5.6.2開發Service代碼:WorklogService.java和WorklogServiceImpl.java
5.6.3開發單元測試代碼:WorklogServiceTest.java
5.6.4運行單元測試類WorklogServiceTest.java
5.7開發公司公告表notice操作代碼
5.7.1開發DAO代碼:NoticeDAO.java和NoticeDAOImpl.java
5.7.2開發Service代碼:NoticeService.java和NoticeServiceImpl.java
5.7.3開發單元測試代碼:NoticeServiceTest.java
5.7.4運行單元測試類NoticeServiceTest.java
5.8開發工作會議表meeting操作代碼
5.8.1開發DAO代碼:MeetingDAO.java和MeetingDAOImpl.java
5.8.2開發Service代碼:MeetingService.java和MeetingServiceImpl.java
5.8.3開發單元測試代碼:MeetingServiceTest.java
5.8.4運行單元測試類MeetingServiceTest.java
5.9開發單元測試套件AllTest.java
5.1本課小結
5.10.1打包emis01(Hibernate+MySQL).zip
5.10.2繼續下一課:Hibernate項目實戰-企業信息管理系統Oracle資料庫開發
第6課Hibernate項目實戰-企業信息管理系統Oracle資料庫開發
6.1導出映射文件和Domain層
6.1.1新建項目hibernateoracle
6.1.2給數據表設置主鍵
6.1.3使用MiddleGenIDE導出所有表的映射文件和Domain層
6.1.4修改導出文件
6.2完成項目並運行
6.2.1添加DAO、Service和單元測試代碼
6.2.2運行測試套件類AllTest.java
6.3本課小結
6.3.1打包emis02(Hibernate+Oracle).zip
6.3.2繼續下一課:Hibernate項目實戰-企業信息管理系統SQLServer資料庫開發
第7課Hibernate項目實戰-企業信息管理系統SQLServer資料庫開發
7.1導出映射文件和Domain層
7.1.1新建項目hibernatesqlserver
7.1.2給數據表設置主鍵
7.1.3使用MiddleGenIDE導出所有表的映射文件和Domain層
7.1.4修改映射文件
7.2完成項目並運行
7.2.1添加DAO、Service和單元測試代碼
7.2.2運行測試套件類AllTest.java
7.3本課小結
7.3.1打包emis03(Hibernate+SQLServer).zip
7.3.2繼續下一課:持久層框架iBATIS
第3部分持久層框架iBATIS
第8課iBATIS快速入門
8.1了解iBATIS
8.1.1iBATIS簡介
8.1.2iBATIS開發步驟
8.1.3選擇Hibernate還是iBATIS
8.2iBATIS開發准備
8.2.1iBATIS下載與配置過程
8.2.2iBATIS配置文件sqlMapConfig.xml
8.2.3下載並添加MySQL驅動mysql-connector-java-5.0.8-bin.jar
8.3iBATIS快速上手-iBATISTest樣例
8.3.1添加iBATIS配置文件sqlMapConfig.xml
8.3.2編寫映射文件user_SqlMap.xml
8.3.3新建持久化類User.java
8.3.4編寫輔助類SqlMapClientFactory.java
8.3.5編寫DAO類UserDAO.java
8.3.6編寫Service類UserService.java
8.3.7運行UserService.java查看結果
8.3.8打包iBATISTest.zip
8.4本課小結
8.4.1總結本課的知識點
8.4.2要掌握的關鍵點
8.4.3課後上機作業
8.4.4繼續下一課:iBATIS核心技術詳解
第9課iBATIS核心技術詳解
第10課iBATLS代碼生成工具iBATLS
第11課iBATLS項目實戰——企業信息管理系統MySQL資料庫開發
第12課iBATLS項目實踐——企業信息管理系統Oracle資料庫開發
第13課iBATLS項目實踐——企業信息管理系統SQLServer資料庫開發
第4部分表現層框架Struts1+Hibernate/BATIS
第14課Struts快速入門
第15課Struts核心組件詳解
第16課Struts標簽庫詳解
第17課Struts應用國際化
第18課Struts數據校險
第19課Struts與SiteMesh集成
第20課Struts訪問資料庫
第21課Struts項目實戰——企業信息管理系統Struts1+Hibernate實現
第22課Struts項目實踐——企業信息管理系統Struts+iBATIS實現
第5部分表現層框架Struts2+Hibernate/iBATIS
第23課Struts2快速入門
第24課Struts2核心組件詳解
第25課Struts2標簽庫詳解
第26課Struts2應用國際化
第27課Struts2數據校驗
第28課Struts2數據轉換器
第29課Struts2攔截器
第30課Struts2項目實戰——企業信息
第31課Struts2項目實戰——企業信息管理系統Struts2+iBATIS實現
第6部分Spring快速入門
第32課Spring快速入門
第33課Spring用做IoC容器
第34課Spring用作MVC框架
第35課Spring標簽庫
第36課Spring應用國際化
第37課Spring數據校驗
第38課Spring資料庫開發技術
第7部分多層框架集成Struts1/Struts2+Spring+Hibernate/iBATIS
第39課SSH1項目實戰——企業信息管理系統Struts2+Spring+Hibernate
第40課SSI1項目實戰——企業信息管理系統Struts2+Spring+iBATIS
第41課SSH2項目實踐——企業信息管理系統Struts2+Spring+Hibernate
第42課SSH2項目實戰——企業信息管理系統Struts2+Spring+iBATIS
……
⑺ JAVAWEB項目怎麼實現驗證碼
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.image.BufferedImage;
importjava.io.IOException;
importjava.io.OutputStream;
importjava.util.Random;
importjavax.imageio.ImageIO;
publicclassCode{
//圖片的寬度。
privateintwidth=160;
//圖片的高度。
privateintheight=38;
//驗證碼字元個數
privateintcodeCount=4;
//驗證碼干擾線數
privateintlineCount=20;
//驗證碼
privateStringcode=null;
//驗證碼圖片Buffer
privateBufferedImagebuffImg=null;
Randomrandom=newRandom();
privatebooleantype=false;
publicCode(){
}
publicCode(intwidth,intheight){
this.width=width;
this.height=height;
}
publicCode(intwidth,intheight,intcodeCount){
this.width=width;
this.height=height;
this.codeCount=codeCount;
}
publicCode(intwidth,intheight,intcodeCount,intlineCount){
this.width=width;
this.height=height;
this.codeCount=codeCount;
this.lineCount=lineCount;
}
publicvoidinit(booleantype){
this.type=type;
}
//生成圖片
privatevoidcreatImage(booleantype){
intfontWidth=width/codeCount;//字體的寬度
intfontHeight=height-5;//字體的高度
intcodeY=height-8;
//圖像buffer
buffImg=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphicsg=buffImg.getGraphics();
//Graphics2Dg=buffImg.createGraphics();
//設置背景色
g.setColor(getRandColor(200,250));
g.fillRect(0,0,width,height);//設置字體
Fontfont=null;
if(!type)font=newFont("Fixedsys",Font.BOLD,fontHeight);
elsefont=getFont(fontHeight);
g.setFont(font);
//設置干擾線
for(inti=0;i<lineCount/2;i++){
intxs=random.nextInt(width);
intys=random.nextInt(height);
intxe=xs+random.nextInt(width);
intye=ys+random.nextInt(height);
g.setColor(getRandColor(1,255));
if(!type)g.drawLine(xs,ys,xe,ye);
elseshear(g,width,height,getRandColor(1,255));
}
//添加噪點
floatyawpRate=0.01f;//雜訊率
intarea=(int)(yawpRate*width*height);
for(inti=0;i<area;i++){
intx=random.nextInt(width);
inty=random.nextInt(height);
buffImg.setRGB(x,y,random.nextInt(255));
}
Stringstr1=randomStr(codeCount);//得到隨機字元
this.code=str1;
for(inti=0;i<codeCount;i++){
StringstrRand=str1.substring(i,i+1);
g.setColor(getRandColor(1,255));
//g.drawString(a,x,y);
//a為要畫出來的東西,x和y表示要畫的東西最左側字元的基線位於此圖形上下文坐標系的(x,y)位置處
g.drawString(strRand,i*fontWidth+3,codeY);
}
}
//得到隨機字元
privateStringrandomStr(intn){
Stringstr1="";//I和l不要
Stringstr2="";
intlen=str1.length()-1;
doubler;
for(inti=0;i<n;i++){
r=(Math.random())*len;
str2=str2+str1.charAt((int)r);
}
returnstr2;
}
//得到隨機顏色
privateColorgetRandColor(intfc,intbc){//給定范圍獲得隨機顏色
if(fc>255)
fc=255;
if(bc>255)
bc=255;
intr=fc+random.nextInt(bc-fc);
intg=fc+random.nextInt(bc-fc);
intb=fc+random.nextInt(bc-fc);
returnnewColor(r,g,b);
}
/**
*產生隨機字體
*/
privateFontgetFont(intsize){
Randomrandom=newRandom();
Fontfont[]=newFont[5];
font[0]=newFont("Ravie",Font.PLAIN,size);
font[1]=newFont("AntiqueOliveCompact",Font.PLAIN,size);
font[2]=newFont("Fixedsys",Font.PLAIN,size);
font[3]=newFont("WideLatin",Font.PLAIN,size);
font[4]=newFont("GillSansUltraBold",Font.PLAIN,size);
returnfont[random.nextInt(5)];
}
//扭曲方法
privatevoidshear(Graphicsg,intw1,inth1,Colorcolor){
shearX(g,w1,h1,color);
shearY(g,w1,h1,color);
}
privatevoidshearX(Graphicsg,intw1,inth1,Colorcolor){
intperiod=random.nextInt(2);
booleanborderGap=true;
intframes=1;
intphase=random.nextInt(2);
for(inti=0;i<h1;i++){
doubled=(double)(period>>1)
*Math.sin((double)i/(double)period
+(6.2831853071795862D*(double)phase)
/(double)frames);
g.Area(0,i,w1,1,(int)d,0);
if(borderGap){
g.setColor(color);
g.drawLine((int)d,i,0,i);
g.drawLine((int)d+w1,i,w1,i);
}
}
}
privatevoidshearY(Graphicsg,intw1,inth1,Colorcolor){
intperiod=random.nextInt(40)+10;//50;
booleanborderGap=true;
intframes=20;
intphase=7;
for(inti=0;i<w1;i++){
doubled=(double)(period>>1)
*Math.sin((double)i/(double)period
+(6.2831853071795862D*(double)phase)
/(double)frames);
g.Area(i,0,1,h1,0,(int)d);
if(borderGap){
g.setColor(color);
g.drawLine(i,(int)d,i,0);
g.drawLine(i,(int)d+h1,i,h1);
}
}
}publicvoidwrite(OutputStreamsos)throwsIOException{
if(buffImg==null)creatImage(type);
ImageIO.write(buffImg,"png",sos);
//JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(sos);
//encoder.encode(buffImg);
sos.close();
}
publicBufferedImagegetBuffImg(){
if(buffImg==null)creatImage(type);
returnbuffImg;
}
publicStringgetCode(){
returncode.toLowerCase();
}
//使用方法
/*publicvoidgetCode3(HttpServletRequestreq,HttpServletResponseresponse,HttpSessionsession)throwsIOException{
//設置響應的類型格式為圖片格式
response.setContentType("image/jpeg");
//禁止圖像緩存。
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
CreateImageCodevCode=newCreateImageCode(100,30,5,10);
session.setAttribute("code",vCode.getCode());
vCode.write(response.getOutputStream());
response.flushBuffer();
}*/
}
⑻ java的普通web項目怎麼發布為jar包(像springBoot打出來的可執行jar包)
不行的,java程序啟動的入口只能是main方法.普通的javaWeb工程是實現Servlet等Web介面,然後由符合規范的web容器創建實例,進而執行.普通的javaWeb工程程序入口,不能單獨執行.
⑼ javaweb項目如何在區域網內發布
查找到自己的電腦IP。
⑽ 如何編寫一個簡單的java web前後端實例
Java代碼編寫的30條實踐建議,很多人認為學習java需要較好的計算機語言基礎,而事實上高中學歷的學習java,月薪過萬的比比皆是,Java代碼編寫的30條實踐建議,java知識點學習貴在積累。
Java代碼編寫的30條實踐建議:
(1) 類名首字母應該大寫。欄位、方法以及對象(句柄)的首字母應小寫。對於所有標識符,其中包含的所有單詞都應緊靠在一起,而且大寫中間單詞的首字母。
例如:
ThisIsAClassName
thisIsMethodOrFieldName
若在定義中出現了常數初始化字元,則大寫static final基本類型標識符中的所有字母。這樣便可標 志出它們屬於編譯期的常數。
Java包(Package)屬於一種特殊情況:它們全都是小寫字母,即便中間的單詞亦是如此。對於域名擴展名稱,如com,org,net或者e等,全部都應小寫(這也是Java 1.1和Java 1.2的區別之一)。
(2) 為了常規用途而創建一個類時,請採取"經典形式",並包含對下述元素的定義:
equals()
hashCode()
toString()
clone()(implement Cloneable)
implement Serializable
(3) 對於自己創建的每一個類,都考慮置入一個main(),其中包含了用於測試那個類的代碼。為使用一個項目中的類,我們沒必要刪除測試代碼。若進行了任何形式的改動,可方便地返回測試。這些代碼也可作為如何使用類的一個示例使用。
(4) 應將方法設計成簡要的、功能性單元,用它描述和實現一個不連續的類介面部分。理想情況下,方法應簡明扼要。若長度很大,可考慮通過某種方式將其分割成較短的幾個方法。這樣做也便於類內代碼的重復使用(有些時候,方法必須非常大,但它們仍應只做同樣的一件事情)。
(5) 設計一個類時,請設身處地為客戶程序員考慮一下(類的使用方法應該是非常明確的)。然後,再設身處地為管理代碼的人考慮一下(預計有可能進行哪些形式的修改,想想用什麼方法可把它們變得更簡單)。
(6) 使類盡可能短小精悍,而且只解決一個特定的問題。下面是對類設計的一些建議:
■一個復雜的開關語句:考慮採用"多形"機制
■數量眾多的方法涉及到類型差別極大的操作:考慮用幾個類來分別實現
■許多成員變數在特徵上有很大的差別:考慮使用幾個類
(7) 讓一切東西都盡可能地"私有"--private。可使庫的某一部分"公共化"(一個方法、類或者一個欄位等等),就永遠不能把它拿出。若強行拿出,就可能破壞其他人現有的代碼,使他們不得不重新編寫和設計。若只公布自己必須公布的,就可放心大膽地改變其他任何東西。
在多線程環境中,隱私是特別重要的一個因素--只有private欄位才能在非同步使用的情況下受到保護。
(8) 謹惕"巨大對象綜合症"。對一些習慣於順序編程思維、且初涉OOP領域的新手,往往喜歡先寫一個順序執行的程序,再把它嵌入一個或兩個巨大的對象里。根據編程原理,對象表達的應該是應用程序的概念,而非應用程序本身。
(9) 若不得已進行一些不太雅觀的編程,至少應該把那些代碼置於一個類的內部。
(10) 任何時候只要發現類與類之間結合得非常緊密,就需要考慮是否採用內部類,從而改善編碼及維護工作(參見第14章14.1.2小節的"用內部類改進代碼")。
(11) 盡可能細致地加上注釋,並用javadoc注釋文檔語法生成自己的程序文檔。
(12) 避免使用"魔術數字",這些數字很難與代碼很好地配合。如以後需要修改它,無疑會成為一場噩夢,因為根本不知道"100"到底是指"數組大小"還是"其他全然不同的東西"。所以,我們應創建一個常數,並為其使用具有說服力的描述性名稱,並在整個程序中都採用常數標識符。這樣可使程序更易理解以及更易維護。
(13) 涉及構建器和異常的時候,通常希望重新丟棄在構建器中捕獲的任何異常--如果它造成了那個對象的創建失敗。這樣一來,調用者就不會以為那個對象已正確地創建,從而盲目地繼續。
(14) 當客戶程序員用完對象以後,若你的類要求進行任何清除工作,可考慮將清除代碼置於一個良好定義的方法里,採用類似於cleanup()這樣的名字,明確表明自己的用途。除此以外,可在類內放置一個boolean(布爾)標記,指出對象是否已被清除。在類的finalize()方法里,請確定對象已被清除,並已丟棄了從RuntimeException繼承的一個類(如果還沒有的話),從而指出一個編程錯誤。在採取象這樣的方案之前,請確定finalize()能夠在自己的系統中工作(可能需要調用System.runFinalizersOnExit(true),從而確保這一行為)。
(15) 在一個特定的作用域內,若一個對象必須清除(非由垃圾收集機制處理),請採用下述方法:初始化對象;若成功,則立即進入一個含有finally從句的try塊,開始清除工作。
(16) 若在初始化過程中需要覆蓋(取消)finalize(),請記住調用super.finalize()(若Object屬於我們的直接超類,則無此必要)。在對finalize()進行覆蓋的過程中,對super.finalize()的調用應屬於最後一個行動,而不應是第一個行動,這樣可確保在需要基礎類組件的時候它們依然有效。
(17) 創建大小固定的對象集合時,請將它們傳輸至一個數組(若准備從一個方法里返回這個集合,更應如此操作)。這樣一來,我們就可享受到數組在編譯期進行類型檢查的好處。此外,為使用它們,數組的接收者也許並不需要將對象"造型"到數組里。
(18) 盡量使用interfaces,不要使用abstract類。若已知某樣東西准備成為一個基礎類,那麼第一個選擇應是將其變成一個interface(介面)。只有在不得不使用方法定義或者成員變數的時候,才需要將其變成一個abstract(抽象)類。介面主要描述了客戶希望做什麼事情,而一個類則致力於(或允許)具體的實施細節。
(19) 在構建器內部,只進行那些將對象設為正確狀態所需的工作。盡可能地避免調用其他方法,因為那些方法可能被其他人覆蓋或取消,從而在構建過程中產生不可預知的結果(參見第7章的詳細說明)。
(20) 對象不應只是簡單地容納一些數據;它們的行為也應得到良好的定義。
(21) 在現成類的基礎上創建新類時,請首先選擇"新建"或"創作"。只有自己的設計要求必須繼承時,才應考慮這方面的問題。若在本來允許新建的場合使用了繼承,則整個設計會變得沒有必要地復雜。
(22) 用繼承及方法覆蓋來表示行為間的差異,而用欄位表示狀態間的區別。一個非常極端的例子是通過對不同類的繼承來表示顏色,這是絕對應該避免的:應直接使用一個"顏色"欄位。
(23) 為避免編程時遇到麻煩,請保證在自己類路徑指到的任何地方,每個名字都僅對應一個類。否則,編譯器可能先找到同名的另一個類,並報告出錯消息。若懷疑自己碰到了類路徑問題,請試試在類路徑的每一個起點,搜索一下同名的.class文件。
(24) 在Java 1.1 AWT中使用事件"適配器"時,特別容易碰到一個陷阱。若覆蓋了某個適配器方法,同時拼寫方法沒有特別講究,最後的結果就是新添加一個方法,而不是覆蓋現成方法。然而,由於這樣做是完全合法的,所以不會從編譯器或運行期系統獲得任何出錯提示--只不過代碼的工作就變得不正常了。
(25) 用合理的設計方案消除"偽功能"。也就是說,假若只需要創建類的一個對象,就不要提前限制自己使用應用程序,並加上一條"只生成其中一個"注釋。請考慮將其封裝成一個"獨生子"的形式。若在主程序里有大量散亂的代碼,用於創建自己的對象,請考慮採納一種創造性的方案,將些代碼封裝起來。
(26) 警惕"分析癱瘓"。請記住,無論如何都要提前了解整個項目的狀況,再去考察其中的細節。由於把握了全局,可快速認識自己未知的一些因素,防止在考察細節的時候陷入"死邏輯"中。
(27) 警惕"過早優化"。首先讓它運行起來,再考慮變得更快--但只有在自己必須這樣做、而且經證實在某部分代碼中的確存在一個性能瓶頸的時候,才應進行優化。除非用專門的工具分析瓶頸,否則很有可能是在浪費自己的時間。
性能提升的隱含代價是自己的代碼變得難於理解,而且難於維護。
(28) 請記住,閱讀代碼的時間比寫代碼的時間多得多。思路清晰的設計可獲得易於理解的程序,但注釋、細致的解釋以及一些示例往往具有不可估量的價值。無論對你自己,還是對後來的人,它們都是相當重要的。如對此仍有懷疑,那麼請試想自己試圖從聯機Java文檔里找出有用信息時碰到的挫折,這樣或許能將你說服。
(29) 如認為自己已進行了良好的分析、設計或者實施,那麼請稍微更換一下思維角度。試試邀請一些外來人士--並不一定是專家,但可以是來自本公司其他部門的人。請他們用完全新鮮的眼光考察你的工作,看看是否能找出你一度熟視無睹的問題。採取這種方式,往往能在最適合修改的階段找出一些關鍵性的問題,避免產品發行後再解決問題而造成的金錢及精力方面的損失。
(30) 良好的設計能帶來最大的回報。簡言之,對於一個特定的問題,通常會花較長的時間才能找到一種最恰當的解決方案。但一旦找到了正確的方法,以後的工作就輕松多了,再也不用經歷數小時、數天或者數月的痛苦掙扎。我們的努力工作會帶來最大的回報(甚至無可估量)。而且由於自己傾注了大量心血,最終獲得一個出色的設計方案,成功的快感也是令人心動的。堅持抵制草草完工的誘惑--那樣做往往得不償失。