2011-02-03 9 views
9

は、私はこのJavaブールラッパークラスはどのようにインスタンス化されますか? Javaで

Boolean b = true ; 

ようなコードを書くことができ、それが動作します。私は今、値 "真"を保持するオブジェクトを持っています。

どのように機能しますか?なぜ値をコンストラクタに渡さなければならないのですか?同様に:

Boolean b = new Boolean(true) ; 

また、同様の方法でインスタンス化できるカスタムクラスを作成できますか?もしそうなら、それは何と呼ばれていますか?

Foobar foobar = "Test" ; 

をこうして私自身のラッパークラスを持っている:

だから私はこのような何かを行うことができます。

ありがとうございます。

+0

これはオートボクシングと呼ばれています。グーグル「java autoboxing」は、あなたが目撃しているものに関する多くの情報を提供します。 –

+2

後者の部分は、Javaが提供する以上の機械を必要とします。スカラーでは、例えばこれはおそらく暗黙のうちに行われる可能性があります。 – svrist

+0

ありがとうございました。以前は「オートボクシング」という言葉を聞いたことはありませんでした。 – CrazyPenguin

答えて

13

いいえ、後者はできません。

前者はautoboxingと呼ばれ、ラッパー対応のプリミティブを自動ラップするためにJava v1.5で導入されました。

ジェネリックおよび/またはコレクションを使用する際にオートボクシングからの利益が明確に見られてすることができます

記事から:「プリミティブ型のオートボクシングと自動ボックス化解除」サンプル我々はJ2SE 5.0 in a Nutshell

持っている:

前(オートボクシングが追加されました)

ArrayList<Integer> list = new ArrayList<Integer>(); 
list.add(0, new Integer(42)); 
int total = (list.get(0)).intValue(); 

以降

ArrayList<Integer> list = new ArrayList<Integer>(); 
list.add(0, 42); 
int total = list.get(0); 

ご覧のとおり、コードはより明確です。

ただ心の中でマニュアルの最後の音を負担:

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

String s = "foobar" 

それは本当に、単にJavaでの特典です:

1

それはあなたのような文字列オブジェクトを作ることができるのと同じ方法です。私はあなたがなぜあなた自身のラッパークラスを作るのか、どちらのプリミティブなデータ型も既に定義済みのラッパーを持っていると考えているのかどうか分かりません。

+0

私は実際にそれが必要なわけではありませんが、どのように動作するのか分かりませんでした。 "autoboxing"というフレーズを知らなくても、 – CrazyPenguin

0

これはautoboxingと呼ばれ、基本的にコンパイラがあなたのために行うものです。これはJava 5でのみ追加されました。その前にnew Boolean(true)または(より良い)Boolean.TRUEを使用する必要がありました。

いいえ、独自のクラスでは使用できません。プリミティブなラッパークラスに対してのみ行われます。

3

どのように機能しますか?

これはコンパイラ機能です。コンパイラは自動的にボクシング操作を生成します。何それは実際にやることは、この方法は、既存の(不変)インスタンスにBoolean.TRUEとBoolean.FALSEではなく、新しいものを作成するのに使用されますので

Boolean.valueOf(true); 

を生成することです。

1

この機能はJava 1.5に追加され、Autoboxingと呼ばれています。この種の魔法はプリミティブな値と通信相手のラッパーだけが利用できます。

あなたは自分でJavaで行うことはできません。あなたがまだそれを望むなら、Scalaに行くより - それは素晴らしいです!つまり、implicit conversionsというフィーチャーを使用することができます。あなたの場合の小さな例です:

case class Foobar(value: String) 
implicit def convertStringToFoobar(s: String) = Foobar(s) 
val foobar: Foobar = "Test"; 
関連する問題