java十宗罪

java十宗罪

非常抱歉,第1點關于"abc"=="abc"返回false是我搞錯了,在java里是返回true的,我沒有經過實驗就這么說了,非常抱歉。之所以會這么說,是因為不記得是哪一種,因為我使用了==進行了字符串的比較,結果并沒有返回我相要的結果,然后請教老人,老人們就訓誡道:最好使用equals進行比較,而不要使用==,故有此感慨。


好吧,我知道看這標題很多人就忍不住要拍磚或表示不贊同了,我都接受。

我在遇到問題時,找一些搞java朋友求助,有能解決的,我想說的是不能解決的情況下,他們大多會說:“你怎么能這么弄呢?這么搞是不行的,你首先在思路上就錯誤了,我們從來就不這么做?!?,比如“我們一般很少用存儲過程,你用這么多存儲過程,我建議你使用hibernate代碼實現你的業務,而不是用存儲過程”,這個問題是在我遇到用hibernate調存儲過程時發生一些狀況后,我一個搞java的朋友也無法解決時,他如此說道。
java開發人員還喜歡說:這個不應該由jdk或某某框架完成,而應該是由勇敢、勤勞、智慧的您來編寫實現的。

以下都是我在開發java項目時,遇到的一些問題,可能也有寫得不對的地方,望指正。
遇到很多問題,一時間無法全部拿出來討論,就隨便列舉了幾條。

1."abc"=="abc"返回的結果是false,很多初學java的都要在這個問題很浪費很多時間,因為會非常自信的以為這里會返回true,根本不會想到原來問題出在這里。網上看到有貼子討論過這個問題,說什么java是純面向對象的語言,==操作符是比較地址什么的,而"abc"是引用,所以不能使用==操作符進行比較,而應該使用equals方法來進行比較,會犯這種錯誤的,多半是因為自己基礎不牢,卻還來說java的不是。我看到一個人說的一個例子,很能表示我的感想,是這么說的:有一天我去到一個餐廳,因為餐廳門口有一灘水,導致路面很滑,我不小心摔倒了,于是我找來餐廳經理,追究其責任,結果餐廳經理告訴我,這是因為我自己走路的姿勢不對,所以滑倒了,與餐廳無關。

2.為什么沒有get;set;屬性,而是使用getXX();setXX()方法來代替,反射難道不要成本嗎?
  我所了解到的struts\spring\hibernate里都大量用到這種方式,比如struts中的vo對象,里面若有個getUsername(),在頁面里可以用<s:property value="username"/>來取值,這中間我想應該是用反射來找到getUsername()方法,再取得其值的吧,同樣的spring\hibernate中也大量用到這種方式,我想問,反射不是說很低效的嗎?

3.做個自定義標簽還要自己寫個tld配置文件,有時在看一些java的相關書籍上面提到零配置時,我就覺得非??尚?,不知道所謂零配置的精神到底體現在哪里?也許寫個配置文件也并沒有那么難,但關鍵問題在于,從技術上來講這個tld明顯是可以不要的啊,tld里面主要就描述了這個tag叫什么名字有哪些屬性,分別是什么類型,這些信息完全可以在類里面表示,只要是實現Tag接口的類就被自動識別為自定義標簽這樣不好嗎?通過識別類里有哪些getXX();setXX();(更好的方案是有get;set;屬性)來確定這個自定義標簽有哪些屬性,又分別是什么類型這樣不好嗎?為什么還要多此一舉搞個tld配置文件?
  還有個問題是,如果我寫了個MyTag的類,繼承了某個自定義標簽類,我還要為MyTag寫個相應的tld配置,我不知道將來還有沒有其他開發人員會繼承我的MyTag,也許就算我熱烈歡迎別人來繼承我的MyTag,但當別人看到我MyTag里近三四十個getXX();setXX();之后,想到要為其寫上相應的tld配置文件而望而生怯吧。

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

5.話說java也有這么多年了,hibernate也有這么多年了,到底是我不會用,還是它真的就是這樣的,hibernate對于存儲過程的支持,實在讓我抓狂,居然不支持存儲過程,在網上尋找hibernate調用存儲過程,得到的答案多數就是越過hibernate,而僅僅從hibernate中取得一個connection,再使用jdbc的方式調用存儲過程,這樣做存在一個問題,事務不能得到控制了,由于我還比較水,hibernate的事務控制又是暗箱操作的,好像是只要在service層中寫的業務代碼就都在一個事務中,所以我無法讓我的存儲過程調用和hibernate業務代碼串在一個事務當中,而很多情況下,我是想要讓它們一個失敗就全部失敗的。
  除此之外,也有不越過hibernate而調用存儲過程的辦法,有兩個,也是要寫配置文件,一個是必須要有返回的結果集,我就很納悶,為什么一定要有結果集,我的很多存儲過程就只是處理一些數據,不需要返回結果集的,最難受的是oracle的存儲過程其實不支持返回結果集,必須使用一種變態的游標方式返回,這么做我會感覺到極其反胃。另一個辦法是通過修改實體在insert\update\delete時的默認行為,比如我在insert一個員工時,本來應該是執行sql語句insert into employee values (?,?,?,?)的,我可以通過配置文件修改這個默認行為,改成{call myproc(?,?,?,?)},這種方式顯然也不是我想要的,我只想調用一個存儲過程,執行一個業務的處理。以上兩種方式是會被暗箱操作的事務所管理的,但并不能滿足我的需求,我要怎么辦?

6.數據訪問的結果集對象ResultSet、RowSet、CachedRowSet等沒有得到廣泛的應用,各個框架更多的是傾向于支持實體列表,這么做導致出現一個問題,那就是我只能返回已知結構的結果集,若想要臨時返回個東西還必須要在實體中添加相應的屬性getXX();setXX();方法,比如在hibernate中,要訪問員工表,員工表中本來只有部門ID,沒有部門名稱,你想要有部門名稱,就必須在員工實體中添加一個deptName的屬性,要所有的結果都是已知結構的,這樣很痛苦,如果不返回到實體列表中,也可以返回到 ArrayList<Object[]> 中,但這樣的數據沒有列名稱,不明白為什么不直接查詢到ResultSet中,然后讓更多的框架支持ResultSet,比如struts,在寫頁面使用struts標簽時,可以像操作實體列表一樣操作ResultSet。
<s:iterator id="myResultSet">...</s:iterator>,(還是本來就支持,只是我不會?那就不好意思啦?。┲皇竅M酶嗟目蚣苤С治粗峁溝慕峁?,讓程序員事先設計好結果集的結構是很累人的,就算是代碼生成,也只能生成數據庫里的每一張表對應的實體,但往往我們需要select unkownSchema from myTable得到未知結構的結果集,并不是每次都select *。

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

8.在我看來,struts最大的意義在于,它使得每個jsp頁面都有了一個與之對應的java類的方法,也就是那個action方法。你一定會跟我說,struts的功能并不只如此,但我說,我見過的很多(小公司)的項目,struts的意義就只是這樣的,我想像在我們國家,還有成千上萬的使用java技術的公司,struts對于他們的意義,也就是讓jsp有了后臺代碼。如果僅僅只是如此,為何不由官方提供,直接讓jdk支持,讓struts的先進來彌補jdk的落后嗎?只會欲蓋彌彰。
  或者你會說,即便struts就是提供了讓每個jsp頁面都有一個與之對應的action方法,這也非常偉大了,做到這一點,已經徹底改變了人們開發web項目的方式,由原來的業務代碼和頁面混在一起,變成解偶分離,非常成功了。我想說,不要拿你十年前的榮耀到今天再來說了,已經out的不行了。

9.再說myeclipse,這個ide在java體系中幾乎成為標準,我見過的所有java開發人員都是使用這個IDE,但相比之下,它與visual studio就相差太多了,性能就不說了,如果不做優化,那是慢得想死,話說為什么不能在其一發布出來的默認設置就是最優化的呢?如果我們需要什么插件組件,再自己加載,這樣不是更清楚明白嗎?
另外myeclipse的插件安裝方式實在讓我汗顏,6.x,7.x,8.x這幾個版本的插件安裝方式各不相同,我在想,為什么不能直接雙擊安裝?vss2005就是直接雙擊安裝。至今我還沒搞清楚svn插件怎么安裝的,好吧,我是很水,那個插件的安裝有時要復制文件到指定目錄,有時要啟動myeclipse之后,選擇help菜單下的software updates,有時候又要選擇什么myeclipse configuration center,有時候要連接互聯網在線操作,更甚者,給你個java文件,要你編譯成class文件,再按步驟操作,我是服了。


10.out輸出參數,部分類,擴展方法,lamuda表達式這些非常好的東西,java都沒有,還是我不會嗎?望指正。
   spring,其實我現在還不知道它是干嘛的,好吧,這是我的罪。

望展開激烈、火爆的討論,可以使用分庭伉禮、圍魏救趙、十面埋伏、單挑、圍毆等各種手段。

來源:博客園

上一篇: Java類的加載順序【答疑解惑】

下一篇: java反射

分享到: 更多
北京pk赛车官网开奖 单机游戏斗地主单机版 老重庆时时开彩结果 重庆龙虎官方开奖 吉林时时视频直播 打鱼机技巧规律 输了45万如何回血上岸 篮球实时比分直播 贵州时时彩 双色球10000期历史开奖汇总 四肖三期内必开一期四肖 开户送38体验金不限id的平台 山东时时是什么意思是什么意思 1分快三计划软件下载 球探体育比分电脑版 秒速时时欢迎使用手机版