我認(rèn)為Java語言的10大問題是:\x0d\x0a1、缺少閉包(closure):我想這個(gè)不需要解釋了。函數(shù)式編程已經(jīng)存在幾十年了,但最近幾年,它們獲得了越來越多的關(guān)注,最主要的原因,是它可以自然地編寫并行程序。我部分的同意Joshua Bloch強(qiáng)調(diào)在Java中引入閉包的問題需要再想一想(BGGA提議的方式真的很糟),至少閉包的缺失,使得在Java中做任何真正的函數(shù)式編程都是不可能的。\x0d\x0a2、缺少一等函數(shù):這個(gè)問題與前一個(gè)有些關(guān)聯(lián),但我認(rèn)為它更糟糕。在Java里,要達(dá)到類似效果的唯一方式,是使用著名的、丑陋悲慘的單方法匿名內(nèi)部類,但這看上去的確是一個(gè)拙劣的方法。甚至在C#中,也通過代理機(jī)制,提供了一個(gè)更好的實(shí)現(xiàn)。\x0d\x0a3、原生類型(Primitive types):如果在Java中一切皆對象,那是多么完美啊,但他們偏偏不這樣設(shè)計(jì)。因而,這一點(diǎn)導(dǎo)致了一些問題,比如,不能把一個(gè)int放到集合(Collection)里,這個(gè)在Java5中通過自動(dòng)裝箱特性得到了解決(下面會提到)。它也造成了傳值與傳引用上的困擾,原生類型數(shù)據(jù)是通過值傳給方法的(復(fù)制一份拷貝,然后傳給函數(shù)),而真正的對象是通過傳遞(譯注:其實(shí)是復(fù)制對象地址再傳遞,因此應(yīng)該也是傳值方式,只是由于函數(shù)內(nèi)部可通過這個(gè)對象地址訪問對象,因此效果上類似傳引用)。\x0d\x0a4、自動(dòng)裝箱(Autoboxing)和自動(dòng)拆箱(autounboxing):這個(gè)特性是為了解決因原生類型的存在所導(dǎo)致的問題,在Java5引入的。它允許靜默地轉(zhuǎn)換原生類型到相應(yīng)的對象,但這常常導(dǎo)致其它的問題。比如Integer可以為null,但int不能,因此這時(shí)JVM只能拋出一個(gè)難以調(diào)試的空指針異常(NullPointerException)。此外,它還可能導(dǎo)致其它奇怪的行為,就像下面的例子,我們就很難理解,變量test為什么是false:\x0d\x0aIntger a = new Integer(1024);\x0d\x0aIntger b = new Integer(1024);\x0d\x0aboolean test = a b;\x0d\x0a5、缺少范型具類化:范型是Java5引入的一個(gè)很酷的特征,但是為了保持與舊版本Java的兼容性,導(dǎo)致缺失某些重要的特性,尤其是不能在運(yùn)行時(shí)反省范型的類型。例如,你有一個(gè)方法,接受List參數(shù),如果傳進(jìn)來一個(gè)List,你卻不能知道運(yùn)行里該范型的確切類型。同理,你也不能創(chuàng)建范型數(shù)組。這意味著,盡管下面的代碼看起來很自然,但卻不編譯不了:\x0d\x0aList[] listsOfStrings = new List[3];\x0d\x0a6、不可避免的范型警告:你有發(fā)現(xiàn)過自己陷入不可能去掉的關(guān)于范型的警告么?如果你像我一樣大量使用范型,我打賭你碰到過。事實(shí)上,是這個(gè)問題的規(guī)模化癥狀,讓他們認(rèn)為需要引入一個(gè)特定的注解(@SuppressWarnings("unchecked"))來處理這種情況,我覺得,范型應(yīng)該可能被設(shè)計(jì)的更好。\x0d\x0a7、不能傳void給方法調(diào)用:我得承認(rèn),這種給方法傳遞void的需求,乍一看有些怪異。我喜歡DSL,當(dāng)我實(shí)現(xiàn)自己的DSL庫(lambdaj)的一個(gè)特定特性時(shí),我不得不需要一個(gè)方法聲明成這樣的簽名:void doSomething(Object parameter),這里為這個(gè)方法傳進(jìn)來的參數(shù)parameter,是另一個(gè)方法調(diào)用的結(jié)果,它唯一的目的,是注冊調(diào)用(的對象)自身,以可以在以后執(zhí)行它。讓我吃驚的是,即使println方法返回void,看上去也并沒有一個(gè)好理由,不允許我把代碼寫成這樣,:\x0d\x0adoSomething(System.out.println("test"));\x0d\x0a8、沒有原生的代理機(jī)制:代理是一種非常有效和應(yīng)用廣泛的模式,但Java提供的代理機(jī)制,只針對接口,而不是具體類。這是為什么象cblib這樣提供這種機(jī)制的庫,被如此多的主流框架,如Spring和Hibernate,采用的原因。此外,由于cglib通過運(yùn)行時(shí)創(chuàng)建被代理類的子類來實(shí)現(xiàn)的,因此這些種方式有一個(gè)眾所周知的限制——不能代理final類,比如String。\x0d\x0a9、差勁的Switch...case語句:Java規(guī)定,switch...case只能選擇int和enum(Java5開始)。這一點(diǎn)如果跟更現(xiàn)代的語言如Scala相比,看起來簡直太弱了。\x0d\x0a10、受檢查異常(Checked exception):類似原生類型,受檢查異常也已經(jīng)成為Java的一個(gè)罪孽之源。它迫使程序員必須做下面兩件極其糟糕討厭的事情中的一個(gè):讓你的代碼里充斥大量的、糟糕難讀的、容易出錯(cuò)的try...catch語句,而這樣做的最大意義,只是將捕獲的異常,包裝成運(yùn)行時(shí)異常,然后再重新拋出;或者是讓大量的拋出聲明子句污染你的API,讓接口缺少靈活性和可擴(kuò)展性。\x0d\x0a真正的問題是,這里我提到的這幾大主要問題,唯一的解決辦法,是要做一個(gè)痛苦的決擇,定義一套新的語言規(guī)范,放下當(dāng)前版本的向后兼容性。我猜他們永遠(yuǎn)也不會這么做,雖然我相信,如果編寫一個(gè)能夠自動(dòng)轉(zhuǎn)換舊Java源碼的程序,讓它們與假設(shè)的新版本兼容,并不是很困難。最后,這就是我決定開始尋找一個(gè)更好的JVM兼容語言的原因。
西和網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,西和網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為西和成百上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個(gè)售后服務(wù)好的西和做網(wǎng)站的公司定做!
相信大家在開發(fā)軟件和進(jìn)行軟件維護(hù)的時(shí)候也會發(fā)現(xiàn),有時(shí)候我們會針對一些軟件的功能進(jìn)行代碼重構(gòu)來讓系統(tǒng)運(yùn)行更加的穩(wěn)定。
今天四川java培訓(xùn)就一起來了解一下,在代碼重構(gòu)的過程中都會遇到哪些問題。
1、離線任務(wù)和模型的管理問題。
我們做在線服務(wù)的都有體會,我們經(jīng)常容易對線上業(yè)務(wù)邏輯代碼更關(guān)注一些,而往往忽視離線代碼任務(wù)的管理和維護(hù)。
但離線代碼任務(wù)和模型在推薦場景中又至關(guān)重要。
因此如何有效維護(hù)離線代碼和任務(wù),是我們面臨的一個(gè)問題。
2、特征日志問題。
在推薦系統(tǒng)中,我們常常會遇到特征拼接和特征的『時(shí)間穿越』的問題。
所謂特征時(shí)間穿越,指的是模型訓(xùn)練時(shí)用到了預(yù)測時(shí)無法獲取的『未來信息』,這主要是訓(xùn)練label和特征拼接時(shí)時(shí)間上不夠嚴(yán)謹(jǐn)導(dǎo)致。
如何構(gòu)建便捷通用的特征日志,減少特征拼接錯(cuò)誤和特征穿越,是我們面臨的二個(gè)問題。
3、服務(wù)監(jiān)控問題。
一個(gè)通用的推薦系統(tǒng)應(yīng)該在基礎(chǔ)監(jiān)控上做到盡可能通用可復(fù)用,減少具體業(yè)務(wù)對于監(jiān)控的開發(fā)量,并方便業(yè)務(wù)定位問題。
4、離線任務(wù)和模型的管理問題。
在包括推薦系統(tǒng)的算法方向中,需要構(gòu)建大量離線任務(wù)支持各種數(shù)據(jù)計(jì)算業(yè)務(wù),和模型的定時(shí)訓(xùn)練工作。
但實(shí)際工作中,我們往往忽略離線任務(wù)代碼管理的重要性,當(dāng)時(shí)間一長,各種數(shù)據(jù)和特征的質(zhì)量往往無法保證。
為了盡可能解決這樣的問題,我們從三方面來做,一,將通用推薦系統(tǒng)依賴的離線任務(wù)的代碼統(tǒng)一到一處管理;二,結(jié)合公司離線任務(wù)管理平臺,將所有任務(wù)以通用包的形式進(jìn)行管理,這樣保證所有任務(wù)的都是依賴新包;三,建設(shè)任務(wù)結(jié)果的監(jiān)控體系,將離線任務(wù)的產(chǎn)出完整監(jiān)控起來。
5、特征日志問題。
AndrewNg之前說過:『挖掘特征是困難、費(fèi)時(shí)且需要專業(yè)知識的事,應(yīng)用機(jī)器學(xué)習(xí)其實(shí)基本上是在做特征工程。
』我們理想中的推薦系統(tǒng)模型應(yīng)該是有干凈的RawData,方便處理成可學(xué)習(xí)的Dataset,通過某種算法學(xué)習(xí)model,來達(dá)到預(yù)測效果不斷優(yōu)化的目的。
但現(xiàn)實(shí)中,我們需要處理各種各樣的數(shù)據(jù)源,有數(shù)據(jù)庫的,有日志的,有離線的,有在線的。
這么多來源的RawData,不可避免的會遇到各種各樣的問題,比如特征拼接錯(cuò)誤,特征『時(shí)間穿越』等等。
這里邊反應(yīng)的一個(gè)本質(zhì)問題是特征處理流程的規(guī)范性問題。
那么我們是如何來解決這一點(diǎn)呢,先,我們用在線代替了離線,通過在線落特征日志,而不是RawData,并統(tǒng)一了特征日志Proto,如此就可以統(tǒng)一特征解析腳本。
什么是Java程序員呢?Java程序員是這幾年出現(xiàn)的,他們的著裝經(jīng)常被吐槽,沒有人能夠get到他的笑點(diǎn),總是讓人感覺到莫名其妙,這就是很多人眼中的程序員。程序員在進(jìn)行軟件開發(fā)的時(shí)候,會存在一些錯(cuò)誤的問題,學(xué)會避免是非常關(guān)鍵的。下面電腦培訓(xùn)為大家介紹一下。
1、改一行代碼,不會影響其他功能
做任何事情誠意是非常關(guān)鍵的,在不認(rèn)真的情況下任何事情都是做不好的。如果隨意改動(dòng)代碼,在連接數(shù)據(jù)庫的時(shí)候會出現(xiàn)很多問題。想要成為一名合格的程序員,對代碼的嚴(yán)謹(jǐn)性是非常關(guān)鍵的。
2、不考慮自身問題
在進(jìn)行軟件開發(fā)的過程中,存在問題是不可避免的,如何面對和處理問題才是最關(guān)鍵的。如果在遇到問題的時(shí)候一直認(rèn)為是電腦的問題,這樣想法想要成為合格的程序員是不可能的。IT培訓(xùn)認(rèn)為硬件問題是比較少的,不能很好的解決自己的問題想要成功是不可能的。
3、使用臨時(shí)的方法
臨時(shí)方法并不是解決問題的最好方法,在進(jìn)行編程的過程中,由于可能出現(xiàn)的問題比較多,如果使用臨時(shí)辦法,最終可能會演變?yōu)橛谰玫霓k法,這對于程序員來說,北大青鳥認(rèn)為是非常避諱的解決方法。
4、以后在給代碼添加注釋
習(xí)慣是需要在生活中不斷養(yǎng)成的,好的習(xí)慣是成功的墊腳石。在進(jìn)行代碼書寫的時(shí)候也應(yīng)該有一個(gè)好的習(xí)慣,如果只會一味地推脫,很難讓自己前進(jìn)。
5、測試過,沒有BUG
有的程序員永遠(yuǎn)不承認(rèn)自己存在問題,代碼存在BUG是很正常的,就算進(jìn)行測試之后也會出現(xiàn)同樣的問題。在程序出現(xiàn)問題的時(shí)候不要一味的認(rèn)為是使用而導(dǎo)致的,北大青鳥云南計(jì)算機(jī)學(xué)院認(rèn)為,作為程序員,應(yīng)該解決所有存在的問題。
新聞名稱:java代碼有哪些問題 看懂java代碼
當(dāng)前路徑:http://chinadenli.net/article22/hgopcc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、面包屑導(dǎo)航、建站公司、定制開發(fā)、定制網(wǎng)站、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)