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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

分享到

hanrui

相關(guān)推薦