2011-03-12 101 views
6

Java具有基本類型的對象,整數和基本版本int。Java原始實施

的原始版本是更快/輕的/ etc。所以一般來說你應該使用它們。

我想知道爲什麼是Java的的設計者們不僅有對象類型,並使用原始版本的幕後優化。

所以:

Integer foo(Integer alpha) 
{ 
    Integer total = 0; 
    for(Integer counter = 0; counter < alpha; counter++) 
    { 
     total += counter; 
    } 
    return total; 
} 

會被編譯成代碼是這樣的:

int foo(int alpha) 
{ 
    int total = 0; 
    for(int counter = 0; counter < alpha; counter++) 
    { 
     total += counter; 
    } 
    return total; 
} 

從本質上講,這個假設的java編譯器將整數,雙,浮法,等的情況下,轉換成相當於原始類型。只有在確實需要對象的情況下(比如將元素放入容器中)纔會涉及實際的Integer對象。

注意:上面的代碼已經在Integer對象上使用了運算符,我知道這些運算符實際上是不允許的。由於我正在發明假想的Java編譯器,因此我會假裝這一個像Integer/Float/Double一樣具有特殊的外殼,就像它爲String一樣。

+1

不是一個完全重複的,但我涵蓋了很多的http://stackoverflow.com/questions/5199359/why-do-people-still-use-primitive-types-in-java – corsiKa

+0

@glowcoder這個信息,我知道這一切。但是我想知道是否有什麼會阻止Java在幕後執行所有這些操作,並且不讓我們擔心。也就是說,我們不需要擔心性能問題,因爲編譯器似乎很容易將Long的使用轉換爲long。 –

+1

一個大問題是,你的例子只是簡單的。我很高興java有原始的東西;他們直接映射到硬件,我從來沒有把它們視爲障礙。要求極端逃脫分析工具只是要求太高。想象Integer [],你認爲如何優化,逃避分析並生成與int []相同的代碼(因爲Integer可以爲空)。更多的Integer是不可變的,並且有一個最終的字段,可以阻止某些優化並需要進一步的分析。 – bestsss

回答

0

你需要一些方法來通知你想要的盒裝版本的編譯器,對不對?否則,它將如何知道您是否想要具有屬性或原始版本的版本?當您將Integer傳遞給評估Integer.MAX_VALUE的方法時會發生什麼?

+0

Integer.MAX_VALUE是Integer類中的一個靜態常量。不需要擔心實際的Integer對象獲得該對象。任何時候你確實需要一個Integer對象,你會自動執行它。 –

5

我想知道的是爲什麼Java的設計者不僅擁有對象類型,而且還使用原始版本作爲後臺優化。

要理解Java設計決策背後的原因,您需要了解它們的歷史背景。

原始類型和引用類型之間的強區別是烘焙到語言設計預JDK 1.0。在JDK 1.5之前,就是這樣的:如果你想把整數放到集合中(例如),你明確地使用了Integer.valueOf(int)等。

當JDK 1.5中的類型系統添加了自動裝箱/自動拆箱,它必須以向後兼容的方式完成。他們提出的是一個很好的折衷辦法......但不是他們如果從一張乾淨的牀單開始就能達到什麼。

(而且,他們沒有理由/不能「做對」第一次......早在20世紀90年代早期可能是與原來的語言範圍和他們下到時間壓力做如果他們花費了額外的幾個月/幾年的時間試圖讓它正確,那麼項目可能會被殺死......或者營銷窗口已關閉)

+0

+1 - 因爲語境是王道,儘管我很確定語言設計者會知道如何去做。畢竟有純粹的對象語言預先Java日期;根據我的經驗,大多數偏離純OO的介紹都是爲了讓來自C的人們的生活變得輕鬆。 – CurtainDog