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

如何解決Java語言的十大問題

開發 后端
本文描述了Java語言歷經15年發展間積累的十大問題,并提出了一個簡單的解決方案:尋找一個基于JVM的更好替代語言。

別誤解,其實在我的職業生涯中,我已經編寫了無數的Java代碼;而且,我仍然認為Java一門偉大的(程序)語言。相對于C++和Smalltack,Java已經有了很大的改進;但現在,即使是Java,也已經開始感覺到了其15年的積重。

51CTO編輯推薦:基于Java,超越Java:Scala編程語言專題

事實上,在我的經歷中,我總是不得不面對Java的設計和規范上的一些錯誤、缺陷和不足,這些東西,讓我的Java程序員生活少有樂趣可言。現在全世界的Java程序員有數百萬之眾,Java寫就的代碼更達數億行,要是我說Java在不久的將來死去,這還有些遠。不管怎樣,隨著一些兼容JVM的語言出現(我最鐘意Scala)后,這些問題變得越發不能容忍了,我開始想,是時候慢慢離開Java了(但并不脫離JVM)。具體說來,我認為Java語言的10大問題是:

 1、缺少閉包(closure):我想這個不需要解釋了。函數式編程已經存在幾十年了,但最近幾年,它們獲得了越來越多的關注,最主要的原因,是它可以自然地編寫并行程序。我部分的同意Joshua Bloch強調在Java中引入閉包的問題需要再想一想(BGGA提議的方式真的很糟),至少閉包的缺失,使得在Java中做任何真正的函數式編程都是不可能的。

 2、缺少一等函數:這個問題與前一個有些關聯,但我認為它更糟糕。在Java里,要達到類似效果的唯一方式,是使用著名的、丑陋悲慘的單方法匿名內部類,但這看上去的確是一個拙劣的方法。甚至在C#中,也通過代理機制,提供了一個更好的實現。

 3、原生類型(Primitive types):如果在Java中一切皆對象,那是多么完美啊,但他們偏偏不這樣設計。因而,這一點導致了一些問題,比如,不能把一個int放到集合(Collection)里,這個在Java5中通過自動裝箱特性得到了解決(下面會提到)。它也造成了傳值與傳引用上的困擾,原生類型數據是通過值傳給方法的(復制一份拷貝,然后傳給函數),而真正的對象是通過傳遞(譯注:其實是復制對象地址再傳遞,因此應該也是傳值方式,只是由于函數內部可通過這個對象地址訪問對象,因此效果上類似傳引用)。

 4、自動裝箱(Autoboxing)和自動拆箱(autounboxing):這個特性是為了解決因原生類型的存在所導致的問題,在Java5引入的。它允許靜默地轉換原生類型到相應的對象,但這常常導致其它的問題。比如Integer可以為null,但int不能,因此這時JVM只能拋出一個難以調試的空指針異常(NullPointerException)。此外,它還可能導致其它奇怪的行為,就像下面的例子,我們就很難理解,變量test為什么是false:

  1. Intger a = new Integer(1024);  
  2. Intger b = new Integer(1024);  
  3. boolean test = a <  b || a == b || a > b;  

5、缺少范型具類化:范型是Java5引入的一個很酷的特征,但是為了保持與舊版本Java的兼容性,導致缺失某些重要的特性,尤其是不能在運行時反省范型的類型。例如,你有一個方法,接受List< ?>參數,如果傳進來一個List< String>,你卻不能知道運行里該范型的確切類型。同理,你也不能創建范型數組。這意味著,盡管下面的代碼看起來很自然,但卻不編譯不了:

  1. List< String>[] listsOfStrings = new List< String>[3]; 

6、不可避免的范型警告:你有發現過自己陷入不可能去掉的關于范型的警告么?如果你像我一樣大量使用范型,我打賭你碰到過。事實上,是這個問題的規模化癥狀,讓他們認為需要引入一個特定的注解 (@SuppressWarnings("unchecked")) 來處理這種情況,我覺得,范型應該可能被設計的更好。

7、不能傳void給方法調用:我得承認,這種給方法傳遞void的需求,乍一看有些怪異。我喜歡DSL,當我實現自己的DSL庫(lambdaj)的一個特定特性時,我不得不需要一個方法聲明成這樣的簽名:void doSomething(Object parameter),這里為這個方法傳進來的參數parameter,是另一個方法調用的結果,它唯一的目的,是注冊調用(的對象)自身,以可以在以后執行它。讓我吃驚的是,即使println方法返回void,看上去也并沒有一個好理由,不允許我把代碼寫成這樣,:

  1. doSomething(System.out.println("test")); 

8、沒有原生的代理機制:代理是一種非常有效和應用廣泛的模式,但Java提供的代理機制,只針對接口,而不是具體類。這是為什么象cblib這樣提供這種機制的庫,被如此多的主流框架,如Spring和Hibernate,采用的原因。此外,由于cglib通過運行時創建被代理類的子類來實現的,因此這些種方式有一個眾所周知的限制——不能代理final類,比如String。

9、差勁的Switch...case語句:Java規定,switch...case只能選擇int和enum(Java5開始)。這一點如果跟更現代的語言如Scala相比,看起來簡直太弱了。

10、受檢查異常(Checked exception):類似原生類型,受檢查異常也已經成為Java的一個罪孽之源。它迫使程序員必須做下面兩件極其糟糕討厭的事情中的一個:讓你的代碼里充斥大量的、糟糕難讀的、容易出錯的try...catch語句,而這樣做的最大意義,只是將捕獲的異常,包裝成運行時異常,然后再重新拋出;或者是讓大量的拋出聲明子句污染你的API,讓接口缺少靈活性和可擴展性。

真正的問題是,這里我提到的這幾大主要問題,唯一的解決辦法,是要做一個痛苦的決擇,定義一套新的語言規范,放下當前版本的向后兼容性。我猜他們永遠也不會這么做,雖然我相信,如果編寫一個能夠自動轉換舊Java源碼的程序,讓它們與假設的新版本兼容,并不是很困難。最后,這就是我決定開始尋找一個更好的JVM兼容語言的原因。

原文:10 good reasons to look for something better than Java

作者:Mario Fusco

【編輯推薦】

  1. Java EE容器調查:Tomcat大受歡迎 WebLogic成時間殺手
  2. 可能不再有Java SE 7?甲骨文面臨Java許可問題
  3. Java未來的三大謎題:再談甲骨文收購Sun
  4. Java之父:我們看中的并非Java語言,而是JVM
  5. JDK中還藏著一個寶貝 它的名字叫做VisualVM
責任編輯:yangsai 來源: JavaEye
相關推薦

2022-03-09 23:28:31

Java開發異常

2013-06-21 14:36:02

JavaEEx性能

2013-07-25 14:56:37

JavaEE 性能

2022-06-16 11:02:18

IT領導者首席信息官

2023-09-19 10:19:24

2015-11-02 14:15:05

2012-02-14 09:59:09

NoSQLCouchDB

2017-07-20 07:30:16

大數據數據互聯網

2011-03-16 13:54:51

十大問題應用iOS

2024-06-21 14:13:45

2023-08-03 09:45:52

2019-10-21 08:31:34

容器微服務docker

2009-12-08 14:42:30

Windows 7操作

2023-04-02 13:54:52

Java編程語言開發

2014-01-16 09:25:46

2020-03-16 10:56:06

大數據IT安全

2022-08-16 14:27:56

Java開發編程

2013-01-18 11:18:02

2011-11-16 09:43:07

2011-03-11 14:36:56

SQL Server數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产999精品久久久 精品三级在线观看 | 久草网址 | 日日摸夜夜爽人人添av | 一区二区精品 | aaa一区 | 在线成人福利 | 蜜桃色网| 午夜影院中文字幕 | 欧美www在线观看 | 欧美视频中文字幕 | 欧美精品一区在线发布 | 草草视频在线观看 | 看黄在线 | 久操伊人 | 日日碰狠狠躁久久躁96avv | 中文字幕国产视频 | 国产乱码一二三区精品 | 精品视频在线观看 | 国产精品久久久久久一区二区三区 | 亚洲欧美一区二区三区情侣bbw | 日韩精品成人 | 久久91精品国产 | 欧美又大粗又爽又黄大片视频 | 日韩av免费看 | av中文字幕在线 | www国产成人免费观看视频 | 特黄视频| 久久久久亚洲 | 综合精品在线 | 久久九精品| caoporn国产精品免费公开 | 国产精品中文字幕在线观看 | 在线色网站| 欧美成人影院 | 男女视频在线观看 | 国产区一区二区三区 | 久久艹免费视频 | 亚洲国产黄色av | 国产91久久精品一区二区 | 毛片一区 | 中文字幕亚洲视频 |