成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

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

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

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

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

[[33461]] 

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)代替,反射難道不要成本嗎?

我所了解到的Struts\Spring\Hibernate里都大量用到這種方式,比如Struts中的VO對(duì)象,里面若有個(gè)getUsername(),在頁(yè)面里可以用來(lái)取值,這中間我想應(yīng)該是用反射來(lái)找到getUsername()方法,再取得其值的吧,同樣的Spring\Hibernate中也大量用到這種方式,我想問(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í)體在Insert\Update\Delete時(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ù)所管理的,但并不能滿足我的需求,我要怎么辦?

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í)用。可能***差別的地方就在于,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è)置就是***化的呢?如果我們需要什么插件組件,再自己加載,這樣不是更清楚明白嗎?

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

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

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

【編輯推薦】

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

2011-06-01 10:09:49

Ubuntu

2013-05-10 10:49:53

2018-12-19 15:30:27

Python編程語(yǔ)言

2010-04-06 15:14:08

2010-09-08 11:34:36

2012-09-03 10:06:32

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

2015-10-27 15:41:32

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

2024-07-31 16:48:31

2023-01-12 08:01:11

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

2011-07-08 09:43:51

Chromebook

2011-02-21 09:04:25

2024-06-19 19:28:51

2018-03-20 13:56:12

數(shù)據(jù)庫(kù)MySQL枚舉類(lèi)型

2023-05-08 10:54:39

IT管理CIO

2017-07-27 14:21:44

2021-03-01 18:48:21

Go管理工具

2021-09-10 13:23:57

數(shù)據(jù)閃存 磁盤(pán)

2012-04-29 10:40:23

APP

2018-02-05 23:14:35

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

2009-06-25 12:32:02

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

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

主站蜘蛛池模板: a国产一区二区免费入口 | 在线啊v| 一级毛片色一级 | 91在线视频观看 | 国产一区| 九九看片 | 亚洲精品一区二区三区中文字幕 | 免费毛片网站 | 毛片链接 | 三级在线视频 | av在线免费网站 | 在线观看国产精品一区二区 | 国产探花在线精品一区二区 | 亚洲 欧美 日韩在线 | 欧洲一区视频 | 日韩欧美久久精品 | 免费a网站 | 成人一区二区视频 | 亚洲精品天堂 | 成人精品 | 日韩成人一区 | 国产美女在线观看 | 玖玖视频国产 | 日韩中文一区 | 91五月婷蜜桃综合 | 日韩超碰 | 亚洲美女av网站 | 欧美一级二级视频 | 亚洲国产精品va在线看黑人 | 一级黄色大片 | 韩国av一区二区 | 日日干天天操 | 性高湖久久久久久久久aaaaa | 91日日| 国产精品国产馆在线真实露脸 | 成人h免费观看视频 | 免费看的黄网站 | 浮生影院免费观看中文版 | 在线成人av | 久久亚洲精品视频 | 天堂一区二区三区 |