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

StackOverflow https://stackoverflow.com/questions/4890802

  •  28-10-2019
  •  | 
  •  

質問

Javaでは、このようなコードを書くことができます

Boolean b = true ;

そしてそれは機能します。私は今、「真」の値を保持するオブジェクトを持っています。

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

Boolean b = new Boolean( true ) ;

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

私がこのようなことをすることができるように:

Foobar foobar = "Test" ; 

したがって、私自身のラッパークラスを持っています。

ありがとう

役に立ちましたか?

解決

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

前者は呼ばれています オートボクシング Java V1.5で、ラッパーのカウンターパートにプリミティブであるAuto Lap、Auto Lapに導入されました。

ジェネリックやコレクションを使用する場合、自動ボクシングの利点は明らかに見られます。

記事から: 一言で言えば、j2se 5.0

の中に 「プリミティブタイプの自動ボクシングと自動不動」 私たちが持っているサンプル:

前(自動ボクシングが追加されました)

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);

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

ドキュメントに関する最後のメモを覚えておいてください:

では、いつオートボクシングとボクシングを使用する必要がありますか?それらを使用して、リファレンスタイプとプリミティブの間に「インピーダンスミスマッチ」がある場合にのみ使用します。たとえば、コレクションに数値を入れる必要がある場合。科学的コンピューティングまたはその他のパフォーマンスに敏感な数値コードに自動ボクシングと解凍を使用することは適切ではありません。整数はINTの代替ではありません。オートボクシングと解凍は、プリミティブタイプと参照タイプの区別を曖昧にしますが、それらはそれを排除しません。

他のヒント

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

コンパイラフィーチャーです。コンパイラはボクシングオペレーションを自動的に生成します。それが実際に行うことは、生成することです

Boolean.valueOf(true);

このようにして、既存の(不変の)インスタンスboolean.trueとboolean.falseが新しいものを作成する代わりに使用されるためです。

文字列オブジェクトを作成できるのと同じ方法です。

String s = "foobar"

それは本当にジャワの特典です。原始的なデータ型にはすでに定義済みのラッパーがあることを考えると、なぜあなた自身のラッパークラスを作りたいのか分かりません...

この機能はJava 1.5に追加され、 オートボクシング. 。この種の魔法は、原始的な価値と特派員のラッパーのみが利用できます。

そして、あなたはジャワで自分でそれをすることはできません。あなたがまだそれを望むなら、行くよりも スカラ - それは素晴らしい!つまり、呼び出しの機能を使用できます 暗黙的な変換. 。これがあなたのケースの小さな例です:

case class Foobar(value: String)
implicit def convertStringToFoobar(s: String) = Foobar(s)
val foobar: Foobar = "Test";

いいえ、それは単なるコンパイラマジックです。これらを特別なケースとして扱います(として知られています オートボクシング)。例を参照してください http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html.

それは呼ばれています オートボクシング 基本的には、コンパイラがあなたのためにすることです。それはあなたが使用しなければならなかった前にJava5にのみ追加されました new Boolean( true ), 、または(より良い) Boolean.TRUE.

いいえ、あなたはあなた自身のクラスのためにそれを持つことはできません、それはプリミティブラッパークラスのためにのみ行われます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top