自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

細(xì)數(shù)Java十宗罪

開發(fā) 后端
Java開發(fā)人員還喜歡說:這個(gè)不應(yīng)該由JDK或某某框架完成,而應(yīng)該是由勇敢、勤勞、智慧的您來編寫實(shí)現(xiàn)的。以下都是我在開發(fā)Java項(xiàng)目時(shí),遇到的一些問題,可能也有寫得不對(duì)的地方,望指正。遇到很多問題,一時(shí)間無法全部拿出來討論,就隨便列舉了幾條。

【糾正】非常抱歉,第1點(diǎn)關(guān)于"abc"=="abc"返回false是我搞錯(cuò)了,在java里是返回true的,我沒有經(jīng)過實(shí)驗(yàn)就這么說了,非常抱歉。之所以會(huì)這么說,是因?yàn)椴挥浀檬悄囊环N,因?yàn)槲沂褂昧?=進(jìn)行了字符串的比較,結(jié)果并沒有返回我相要的結(jié)果,然后請(qǐng)教老人,老人們就訓(xùn)誡道:***使用equals進(jìn)行比較,而不要使用==,故有此感慨。

【正文】好吧,我知道看這標(biāo)題很多人就忍不住要拍磚或表示不贊同了,我都接受。

我在遇到問題時(shí),找一些搞Java朋友求助,有能解決的,我想說的是不能解決的情況下,他們大多會(huì)說:“你怎么能這么弄呢?這么搞是不行的,你首先在思路上就錯(cuò)誤了,我們從來就不這么做。”,比如“我們一般很少用存儲(chǔ)過程,你用這么多存儲(chǔ)過程,我建議你使用hibernate代碼實(shí)現(xiàn)你的業(yè)務(wù),而不是用存儲(chǔ)過程”,這個(gè)問題是在我遇到用hibernate調(diào)存儲(chǔ)過程時(shí)發(fā)生一些狀況后,我一個(gè)搞Java的朋友也無法解決時(shí),他如此說道。

Java開發(fā)人員還喜歡說:這個(gè)不應(yīng)該由JDK或某某框架完成,而應(yīng)該是由勇敢、勤勞、智慧的您來編寫實(shí)現(xiàn)的。

以下都是我在開發(fā)Java項(xiàng)目時(shí),遇到的一些問題,可能也有寫得不對(duì)的地方,望指正。

遇到很多問題,一時(shí)間無法全部拿出來討論,就隨便列舉了幾條。

[[33461]] 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

原文鏈接:http://www.cnblogs.com/zhouyou96/archive/2011/06/17/2083566.html

【編輯推薦】

  1. Java輕量級(jí)中間件服務(wù)器:SIwpas
  2. Java編程語言基礎(chǔ)JSP基本語法的詳細(xì)介紹
  3. 如何用Java操作MongoDB
  4. Java泛型簡(jiǎn)明教程
  5. 向Java開戰(zhàn)?別搞錯(cuò)了對(duì)象
責(zé)任編輯:艾婧 來源: zhouyou96的博客
相關(guān)推薦

2011-06-01 10:09:49

Ubuntu

2013-05-10 10:49:53

2018-12-19 15:30:27

Python編程語言

2010-04-06 15:14:08

2012-09-03 10:06:32

云計(jì)算IT云服務(wù)

2010-09-08 11:34:36

2024-07-31 16:48:31

2015-10-27 15:41:32

twitter開發(fā)者錯(cuò)誤策略

2023-01-12 08:01:11

接口突然超時(shí)數(shù)據(jù)庫

2011-07-08 09:43:51

Chromebook

2023-05-08 10:54:39

IT管理CIO

2018-03-20 13:56:12

數(shù)據(jù)庫MySQL枚舉類型

2024-06-19 19:28:51

2011-02-21 09:04:25

2021-03-01 18:48:21

Go管理工具

2017-07-27 14:21:44

2018-02-05 23:14:35

光纖網(wǎng)絡(luò)光纖施工

2012-04-29 10:40:23

APP

2021-09-10 13:23:57

數(shù)據(jù)閃存 磁盤

2009-06-25 12:32:02

節(jié)能成本CIO
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)