2009-04-20 16 views
10

オートボクシング:私は書くことができます:整数i = 0;代わりに:整数i =新しい整数(0);

Integer i = 0; 

の代わり:

オートボクシングは私が書くことができるという事実に降りてくるように思わ

Integer i = new Integer(0); 

ので、コンパイラが自動的にオブジェクトにプリミティブに変換することができます。

はそのアイデアですか?何でこれが大切ですか?

答えて

16

ちょっと単純すぎます。

オートボクシングは、コレクションを使用するときにも有効です。 sunのjavaドキュメントで説明されているように:

コレクションはオブジェクト参照のみを保持できるため、プリミティブ値を適切なラッパークラスにボックスする必要があります。 ...オブジェクトをコレクションから取り除くと、入力したIntegerが取得されます。 intが必要な場合は、intValueメソッドを使用してIntegerをアンボックスする必要があります。このボクシングとアンボクシングのすべては苦痛であり、あなたのコードを混乱させる。 autoboxingとunboxing機能はプロセスを自動化し、苦痛と混乱を排除します。

オートボクシングとアンボクシングはいつ使うべきですか?リファレンスタイプとプリミティブの間に「インピーダンスの不一致」がある場合(たとえば、数値をコレクションに入れなければならない場合など)にのみ使用してください。サイエンスコンピューティングやその他のパフォーマンスに敏感な数値コードには、オートボクシングとアンボクシングを使用することは適切ではありません。 Integerはintの代用ではありません。 autoboxingとunboxingはプリミティブ型と参照型の区別をぼかすが、排除しない。

Great overview of Autoboxing

1

読みやすく、きれいなコードを作成します。特に操作を行っている場合(Javaには演算子のオーバーロードがないため)

1

の私のシニカル帽子:スペック(私はここでオークを意味する)元のJava上の制約のためにアップをするために。初めてのことではありません。

+1

どのような制限がありますか? –

+4

どこから始めますか? Time-Date APIは、最初からCollections APIがなく、「軽い」オブジェクトであり、Object.equals()をオーバーライドしない配列、最初からジェネリックスがないこと、「奇妙な」クローニングメカニズム...最終的には言葉に微妙なクワックを見つけたり、それらを読んだり、どのようにパッチを当てたかを知ることができます。 Javaは、ドットコムブームの復活した埋め込み言語であり、それが示しています。私はMicrosoftにもかかわらず、C#を好む。 –

3

それは考えです。 Integerをintに代入できるのはさらに便利です。

オートボクシングは原因ではなく症状に対処すると主張する人がいます。実際の混乱の原因は、Javaの型システムには一貫性がないということです。プリミティブとオブジェクト参照の両方の必要性は、人工的で厄介です。オートボクシングはやや緩和します。

+0

プリミティブがあるのはどうですか?それは、言語の純粋なオブジェクト指向の性質を損なうことを意味しますか?例えば、Rubyでは整数ですら、オブジェクトです。それはあなたが意味することですか? –

+0

私は本当にそれがなぜ大したことであるかわかりません。彼らは一人で十分に残しておくべきだったと思う。これは今まで私が知ることができるものから多くを追加しているようには見えません。もちろん、私は約5分前にこの機能について学んだだけです。 –

+0

はい、そうです。私はOO純粋主義者ではありませんが、intと整数の両方を自由に使うことがプログラマに利益をもたらす理由は明らかではありません。私は、1つの抽象化が「整数性」をカバーするのに十分であるべきだと思います。 – jcrossley3

1

Joshua BlochのEffective Javaを読んで私が覚えていることから、ボックス化された同等物のプリミティブを考慮する必要があります。その副作用に関係なくオートボクシングが問題を引き起こす可能性があります。

+0

どういう意味ですか? –

+0

プリミティブは渡されると常にコピーされるためです。私はこれが箱入りの相手に当てはまるとは思わない。 – CookieOfFortune

1

Limのコメントに加えて、プリミティブはスタックに格納され、プリミティブラッパーはオブジェクトとしてヒープに格納されます...これに起因する微妙な影響があります。

1

主な利点は、可読性、構文的な砂糖です。 Javaはすでに非常に冗長であるため、Sunはシンタックスを短くするさまざまな方法を試しています。

7

BTW

Integer i = 0; 

区別がのvalueOf()はJavaの場合は(明らかに、これは調整可能となり-128と127の間の値のための新しいオブジェクトを作成しないことである

Integer i = Integer.valueOf(0); 

と等価です6u14)

+0

ありがとうございました!なぜ時には新しいオブジェクトが作成されたのか、非常に混乱しました! – DustByte

+0

@DustByteは共通オブジェクトのみをキャッシュできるためです。すべての整数をキャッシュすると、40 GBのメモリが使用されます(整数の場合のみ) –

5

のようなコードを書くことができるように存在します。 210

単一の整数の場合、デフォルトでIntegerではなくint型を使用する必要があります。整数は主にコレクションで使用するためのものです。

LongがIntegerと同じ値(equals()を使用)と異なることに注意してください。ただしlong型はint(==を使用)と同じです。

関連する問題