2011-03-12 53 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