Top 1:"abc"=="abc"返回的結(jié)果是False,很多初學(xué)Java的都要在這個(gè)問(wèn)題很浪費(fèi)很多時(shí)間,因?yàn)闀?huì)非常自信的以為這里會(huì)返回true,根本不會(huì)想到原來(lái)問(wèn)題出在這里。網(wǎng)上看到有貼子討論過(guò)這個(gè)問(wèn)題,說(shuō)什么Java是純面向?qū)ο蟮恼Z(yǔ)言,==操作符是比較地址什么的,而"abc"是引用,所以不能使用==操作符進(jìn)行比較,而應(yīng)該使用Equals方法來(lái)進(jìn)行比較,會(huì)犯這種錯(cuò)誤的,多半是因?yàn)樽约夯A(chǔ)不牢,卻還來(lái)說(shuō)Java的不是。我看到一個(gè)人說(shuō)的一個(gè)例子,很能表示我的感想,是這么說(shuō)的:有一天我去到一個(gè)餐廳,因?yàn)椴蛷d門(mén)口有一灘水,導(dǎo)致路面很滑,我不小心摔倒了,于是我找來(lái)餐廳經(jīng)理,追究其責(zé)任,結(jié)果餐廳經(jīng)理告訴我,這是因?yàn)槲易约鹤呗返淖藙?shì)不對(duì),所以滑倒了,與餐廳無(wú)關(guān)。

Top 2:為什么沒(méi)有g(shù)et;set;屬性,而是使用getXX();setXX()方法來(lái)代替,反射難道不要成本嗎?

我所了解到的StrutsSpringHibernate里都大量用到這種方式,比如Struts中的VO對(duì)象,里面若有個(gè) getUsername(),在頁(yè)面里可以用來(lái)取值,這中間我想應(yīng)該是用反射來(lái)找到getUsername()方法,再取得其值的吧,同樣的 SpringHibernate中也大量用到這種方式,我想問(wèn),反射不是說(shuō)很低效的嗎?

Top 3:做個(gè)自定義標(biāo)簽還要自己寫(xiě)個(gè)TLD配置文件,有時(shí)在看一些Java的相關(guān)書(shū)籍上面提到零配置時(shí),我就覺(jué)得非常可笑,不知道所謂零配置的精神到底體現(xiàn)在哪里?也許寫(xiě)個(gè)配置文件也并沒(méi)有那么難,但關(guān)鍵問(wèn)題在于,從技術(shù)上來(lái)講這個(gè)TLD明顯是可以不要的啊,TLD里面主要就描述了這個(gè)tag叫什么名字有哪些屬性,分別是什么類(lèi)型,這些信息完全可以在類(lèi)里面表示,只要是實(shí)現(xiàn)Tag接口的類(lèi)就被自動(dòng)識(shí)別為自定義標(biāo)簽這樣不好嗎?通過(guò)識(shí)別類(lèi)里有哪些getXX();setXX();(更好的方案是有g(shù)et;set;屬性)來(lái)確定這個(gè)自定義標(biāo)簽有哪些屬性,又分別是什么類(lèi)型這樣不好嗎?為什么還要多此一舉搞個(gè)TLD配置文件?

還有個(gè)問(wèn)題是,如果我寫(xiě)了個(gè)MyTag的類(lèi),繼承了某個(gè)自定義標(biāo)簽類(lèi),我還要為MyTag寫(xiě)個(gè)相應(yīng)的TLD配置,我不知道將來(lái)還有沒(méi)有其他開(kāi)發(fā)人員會(huì)繼承我的MyTag,也許就算我熱烈歡迎別人來(lái)繼承我的MyTag,但當(dāng)別人看到我MyTag里近三四十個(gè)getXX();setXX();之后,想到要為其寫(xiě)上相應(yīng)的TLD配置文件而望而生怯吧。

Top 4:數(shù)據(jù)訪問(wèn)在我看來(lái),應(yīng)該是個(gè)很簡(jiǎn)單的事情,簡(jiǎn)單來(lái)就,就是執(zhí)行SQL語(yǔ)句,復(fù)雜一點(diǎn),就再加上實(shí)體映射,所有框架解決的問(wèn)題,首先就是要易于使用,在使用過(guò)Hibernate之后,我感覺(jué)它太復(fù)雜了,我在.NET里有一個(gè)數(shù)據(jù)訪問(wèn)層,只需要在指定的配置文件中配置連接字符串,就可以在程序中的任何地方調(diào)用DbHelper.Execute(sql)、 DbHelper.ExecuteDataSet(sql)、DbHelper.ExecuteDataTable(sql)了,使用起來(lái)非常簡(jiǎn)單,當(dāng)然也有實(shí)體映射,DbHelper.save(entity)、DbHelper.delete(entity or key)、DbHelper.select(條件)這一組方法就可以操作實(shí)體對(duì)象,Select返回的是實(shí)體列表,實(shí)體通過(guò)元屬性設(shè)置其關(guān)聯(lián)的表和字段,這中間除了連接字符串之外,是沒(méi)有任何其它配置文件的。相比之下,Hibernate咋需要這么多配置文件?我知道Hibernate也可以配置注解,就不需了HBM配置文件了,但即使這樣,據(jù)我了解依舊還是需要很多除連接字符串之外的其它的相關(guān)配置文件。

Top 5:話說(shuō)Java也有這么多年了,Hibernate也有這么多年了,到底是我不會(huì)用,還是它真的就是這樣的,Hibernate對(duì)于存儲(chǔ)過(guò)程的支持,實(shí)在讓我抓狂,居然不支持存儲(chǔ)過(guò)程,在網(wǎng)上尋找Hibernate調(diào)用存儲(chǔ)過(guò)程,得到的答案多數(shù)就是越過(guò)Hibernate,而僅僅從Hibernate中取得一個(gè)Connection,再使用JDBC的方式調(diào)用存儲(chǔ)過(guò)程,這樣做存在一個(gè)問(wèn)題,事務(wù)不能得到控制了,由于我還比較水,Hibernate的事務(wù)控制又是暗箱操作的,好像是只要在 Service層中寫(xiě)的業(yè)務(wù)代碼就都在一個(gè)事務(wù)中,所以我無(wú)法讓我的存儲(chǔ)過(guò)程調(diào)用和Hibernate業(yè)務(wù)代碼串在一個(gè)事務(wù)當(dāng)中,而很多情況下,我是想要讓它們一個(gè)失敗就全部失敗的。

除此之外,也有不越過(guò)Hibernate而調(diào)用存儲(chǔ)過(guò)程的辦法,有兩個(gè),也是要寫(xiě)配置文件,一個(gè)是必須要有返回的結(jié)果集,我就很納悶,為什么一定要有結(jié)果集,我的很多存儲(chǔ)過(guò)程就只是處理一些數(shù)據(jù),不需要返回結(jié)果集的,最難受的是Oracle的存儲(chǔ)過(guò)程其實(shí)不支持返回結(jié)果集,必須使用一種變態(tài)的游標(biāo)方式返回,這么做我會(huì)感覺(jué)到極其反胃。另一個(gè)辦法是通過(guò)修改實(shí)體在InsertUpdateDelete時(shí)的默認(rèn)行為,比如我在Insert一個(gè)員工時(shí),本來(lái)應(yīng)該是執(zhí)行SQL語(yǔ)句insert into employee values (?,?,?,?)的,我可以通過(guò)配置文件修改這個(gè)默認(rèn)行為,改成{call myproc(?,?,?,?)},這種方式顯然也不是我想要的,我只想調(diào)用一個(gè)存儲(chǔ)過(guò)程,執(zhí)行一個(gè)業(yè)務(wù)的處理。以上兩種方式是會(huì)被暗箱操作的事務(wù)所管理的,但并不能滿(mǎn)足我的需求,我要怎么辦?

Top 6:數(shù)據(jù)訪問(wèn)的結(jié)果集對(duì)象ResultSet、RowSet、CachedRowSet等沒(méi)有得到廣泛的應(yīng)用,各個(gè)框架更多的是傾向于支持實(shí)體列表,這么做導(dǎo)致出現(xiàn)一個(gè)問(wèn)題,那就是我只能返回已知結(jié)構(gòu)的結(jié)果集,若想要臨時(shí)返回個(gè)東西還必須要在實(shí)體中添加相應(yīng)的屬性 getXX();setXX();方法,比如在Hibernate中,要訪問(wèn)員工表,員工表中本來(lái)只有部門(mén)ID,沒(méi)有部門(mén)名稱(chēng),你想要有部門(mén)名稱(chēng),就必須在員工實(shí)體中添加一個(gè)deptName的屬性,要所有的結(jié)果都是已知結(jié)構(gòu)的,這樣很痛苦,如果不返回到實(shí)體列表中,也可以返回到 ArrayList 中,但這樣的數(shù)據(jù)沒(méi)有列名稱(chēng),不明白為什么不直接查詢(xún)到ResultSet中,然后讓更多的框架支持ResultSet,比如Struts,在寫(xiě)頁(yè)面使用 Struts標(biāo)簽時(shí),可以像操作實(shí)體列表一樣操作ResultSet。

…,(還是本來(lái)就支持,只是我不會(huì)?那就不好意思啦!)只是希望讓更多的框架支持未知結(jié)構(gòu)的結(jié)果集,讓程序員事先設(shè)計(jì)好結(jié)果集的結(jié)構(gòu)是很累人的,就算是代碼生成,也只能生成數(shù)據(jù)庫(kù)里的每一張表對(duì)應(yīng)的實(shí)體,但往往我們需要select unkownSchema from myTable得到未知結(jié)構(gòu)的結(jié)果集,并不是每次都Select *。

Top 7:再說(shuō)ResultSet,之所以不直接用這個(gè),而使用實(shí)體列表來(lái)代替,我想是不是也間接的說(shuō)明了,ResultSet這個(gè)類(lèi)不方便使用,.NET 中的DataSet和DataTable就得到大量使用,因?yàn)樗鼈兎奖愫糜脤?shí)用??赡茏畲蟛顒e的地方就在于,DataSet是斷開(kāi)式的存在于內(nèi)存中的微型數(shù)據(jù)庫(kù),而ResultSet只是連接式的數(shù)據(jù)庫(kù)讀取器,相當(dāng)于.NET中的DataReader,必須保持連接才能讀數(shù)據(jù),我知道有 CachedRowSet可以斷開(kāi)式的存儲(chǔ)數(shù)據(jù)在內(nèi)存中,好吧,這個(gè)就不是問(wèn)題了。但另一個(gè)問(wèn)題在滋擾著我,做為存儲(chǔ)結(jié)果集的容器,提供給我們操作這個(gè)結(jié)果集的方法太少了,甚至取得該結(jié)果集的總行數(shù)的方法,我們都需要開(kāi)動(dòng)小腦筋,這么寫(xiě):rs.last(); int count = rs.getRow(); rs.first() 負(fù)責(zé)的話,它需要至少三句代碼才能取到總行數(shù)。也許這只是小問(wèn)題,這個(gè)或許應(yīng)該由勇敢、勤勞、智慧的我們來(lái)實(shí)現(xiàn)。

Top 8:在我看來(lái),Struts最大的意義在于,它使得每個(gè)JSP頁(yè)面都有了一個(gè)與之對(duì)應(yīng)的Java類(lèi)的方法,也就是那個(gè)Action方法。你一定會(huì)跟我說(shuō),Struts的功能并不只如此,但我說(shuō),我見(jiàn)過(guò)的很多(小公司)的項(xiàng)目,Struts的意義就只是這樣的,我想像在我們國(guó)家,還有成千上萬(wàn)的使用Java技術(shù)的公司,Struts對(duì)于他們的意義,也就是讓JSP有了后臺(tái)代碼。如果僅僅只是如此,為何不由官方提供,直接讓JDK支持,讓 Struts的先進(jìn)來(lái)彌補(bǔ)JDK的落后嗎?只會(huì)欲蓋彌彰。

或者你會(huì)說(shuō),即便Struts就是提供了讓每個(gè)JSP頁(yè)面都有一個(gè)與之對(duì)應(yīng)的Action方法,這也非常偉大了,做到這一點(diǎn),已經(jīng)徹底改變了人們開(kāi)發(fā)Web項(xiàng)目的方式,由原來(lái)的業(yè)務(wù)代碼和頁(yè)面混在一起,變成解偶分離,非常成功了。我想說(shuō),不要拿你十年前的榮耀到今天再來(lái)說(shuō)了,已經(jīng)Out的不行了。

Top 9:再說(shuō)MyEclipse,這個(gè)IDE在Java體系中幾乎成為標(biāo)準(zhǔn),我見(jiàn)過(guò)的所有Java開(kāi)發(fā)人員都是使用這個(gè)IDE,但相比之下,它與Visual Studio就相差太多了,性能就不說(shuō)了,如果不做優(yōu)化,那是慢得想死,話說(shuō)為什么不能在其一發(fā)布出來(lái)的默認(rèn)設(shè)置就是最優(yōu)化的呢?如果我們需要什么插件組件,再自己加載,這樣不是更清楚明白嗎?

另外MyEclipse的插件安裝方式實(shí)在讓我汗顏,6.x,7.x,8.x這幾個(gè)版本的插件安裝方式各不相同,我在想,為什么不能直接雙擊安裝?VS2005就是直接雙擊安裝。至今我還沒(méi)搞清楚svn插件怎么安裝的,好吧,我是很水,那個(gè)插件的安裝有時(shí)要復(fù)制文件到指定目錄,有時(shí)要啟動(dòng) MyEclipse之后,選擇Help菜單下的Software Updates,有時(shí)候又要選擇什么MyEclipse configuration center,有時(shí)候要連接互聯(lián)網(wǎng)在線操作,更甚者,給你個(gè)Java文件,要你編譯成Class文件,再按步驟操作,我是服了。

Top 10:Out輸出參數(shù),部分類(lèi),擴(kuò)展方法,LAMUDA表達(dá)式這些非常好的東西,Java都沒(méi)有,還是我不會(huì)嗎?望指正。

我的罪:Spring,其實(shí)我現(xiàn)在還不知道它是干嘛的,好吧,這是我的罪。

分享到

hanrui

相關(guān)推薦