2011-03-12 8 views
6

Javaには、基本型のオブジェクト、整数、プリミティブの両方のバージョンintがあります。Javaプリミティブの実装

プリミティブバージョンの方が高速/軽い/などです。一般的にはそれらを使うべきです。

私は、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オブジェクトが関与することになります。

注:上記のコードは、実際には許可されていないことがわかっている整数オブジェクトの演算子を使用しています。私は仮説的なJavaコンパイラを発明しているので、これはStringのようにInteger/Float/Doubleのための特別なケースを持っているようです。

+1

正確な複製はありませんしかし、私はこの情報をhttp://stackoverflow.com/questions/5199359/why-do-people-still-use-primitive-types-in-java – corsiKa

+0

@glowcoderでたくさんカバーしています。私はそのすべてを知っています。しかし、私は、Javaがシーンの背後にあるこのすべてをやっていて、私たちがそれを心配する必要がないようにするものがあるかどうか疑問に思っています。つまり、パフォーマンスの問題はありません。なぜなら、コンパイラがLongの使用を長時間に変換するのは簡単であると思われるからです。 –

+1

大きな問題は、あなたの例が単なる単純すぎるということです。私は非常に喜んでJavaはプリミティブを持っています。彼らはハードウェアにまっすぐマップし、私は障害としてそれらを見たことはありません。極端なエスケープ解析ツールを求めるのは、あまりにも多くのことを求めているだけです。 Integer []を想像してください。どの程度簡単に最適化し、エスケープして解析し、int []と同じコードを生成しますか?Integerはnullになります。 Morealso整数は不変であり、いくつかの最適化を防ぎ、さらに解析を必要とする最終的なフィールドを持っています。 – bestsss

答えて

0

あなたは、ボックス化されたバージョンが正しいことをコンパイラに知らせるために何か方法が必要ですか?それ以外の場合は、プロパティを持つバージョンかプリミティブなバージョンのどちらが必要かをどのように知ることができますか? IntegerInteger.MAX_VALUEと評価する方法に渡すとどうなりますか?

+0

Integer.MAX_VALUEは、Integerクラスの静的定数です。実際のIntegerオブジェクトを把握する必要はありません。あなたの本当の必要性がIntegerオブジェクトを必要としたときはいつでも、それを自動化します。 –

5

私は、Javaのデザイナーがオブジェクトタイプを持っていて、プリミティブバージョンをシーンの裏に最適化するだけではないのではないかと思います。

Javaの設計上の意思決定の理由を理解するには、それらが作成された履歴のコンテキストを理解する必要があります。

プリミティブ型と参照型の間の強い区別は、JDK 1.0より前の言語設計に組み込まれました。たとえば、整数をコレクションに入れたい場合は、Integer.valueOf(int)などを明示的に使用しました。

JDK 1.5の型システムに自動ボクシング/自動アンボクシングが追加されたときそれは下位互換性のある方法で行われなければならなかった。彼らが思いついたのは良い妥協ではありますが、クリーンなシートから始めると達成できなかったことではありません。

(なぜなら、彼らは「正しい」とは言えませんでしたが... 1990年代初めには元の言語スコープと時間的圧力がかかっていたのでしょう最初のリリースを出してください。余分な月/年を費やして、それを正しくしようとすると、プロジェクトが殺されたり、マーケティング窓口が閉鎖されてしまう可能性があります。

+0

+1 - 文脈は王様なので、私は言語設計者がそれをやる方法を知っていただろうと確信しています。結局のところ、Javaに先行する純粋なオブジェクト言語があります。私の経験から、純粋なOOからの逸脱の大部分は、Cから来ている人々のための生活を容易にするために導入されました。 – CurtainDog