web-dev-qa-db-ja.com

ラッパークラスとプリミティブ型を使用する場合

プリミティブ型のラッパークラスを使用する場合または、どのような状況でラッパー/プリミティブ型を選択する必要がありますか?

85
Gopi

他の人は、Collectionsなどの特定の構造体にはオブジェクトが必要であり、オブジェクトには対応するプリミティブ(メモリとボクシング)よりもオーバーヘッドが大きいと述べています。

別の考慮事項は次のとおりです。

オブジェクトをnullに初期化するか、nullパラメーターをメソッド/コンストラクターに送信して、状態または機能を示すと便利です。これはプリミティブでは実行できません。

多くのプログラマーは、これを示すために数値を0(デフォルト)または-1に初期化しますが、シナリオによっては、これが間違っているか誤解を招く可能性があります。

これはまた、何かが間違って使用されているときにNullPointerExceptionのシーンを設定します。これは、将来の任意のバグよりもはるかにプログラマーに優しいものです。

60
pstanton

一般に、何らかの理由(コレクションに入れるなど)でオブジェクトを必要にしない限り、プリミティブ型を使用する必要があります。それでも、数値のパフォーマンスを最大化する場合は、オブジェクトを必要としない別のアプローチを検討してください。これは ドキュメント でアドバイスされ、 この記事 はオートボクシングがパフォーマンスの大きな違いをどのように引き起こすかを示しています。

15

私の意見では、クラスメンバーがラッパー変数である場合、デフォルト値に依存しません。これは、開発者にとって使いやすい動作です。

1。

class Person {
   int SSN ; // gets initialized to zero by default 
}

2。

class PersonBetter {
  Integer SSN; //gets initialized to null by default
}

最初のケースでは、SSN値を初期化しないでおくことはできません。値を使用しようとする前に値が設定されているかどうかを確認しないと、問題が発生する可能性があります。

2番目のケースでは、SSNをヌルで初期化したままにすることができます。これはNullPointerExceptionにつながる可能性がありますが、SSNフィールドを初期化せずに使用しようとするたびに、知らないうちにデフォルト値(ゼロ)をSSNとしてデータベースに挿入するよりも優れています。

10
Cody

必要な場合にのみラッパータイプを使用します

それらを使用しても、Objectsであるという事実以外はあまり得られません。

また、メモリ使用量とボクシング/アンボクシングに費やされた時間のオーバーヘッドを失います。

7
jjnguy

コレクションは、単純なJavaラッパーオブジェクトの典型的なケースです。ただし、コード(値オブジェクト)でラッパーに特定の意味を与えることを検討することもできます。

私見では、コードの可読性と保守性に帰着するとき、値オブジェクトを使用することはほとんど常に利点があります。オブジェクトに特定の責任があるときに単純なデータ構造をラップすると、多くの場合コードが簡素化されます。これは Domain-Driven Design で非常に重要なことです。

もちろんパフォーマンスの問題もありますが、適切なデータを使用してパフォーマンスを測定し、問題のある領域に向けてより指示されたアクションを実行できるようになるまで、それを無視する傾向があります。また、コードも理解しやすい場合、パフォーマンスの問題を理解しやすくなる場合があります。

3

実際には、ラッパークラスの使用を説明できる状況に遭遇しました。

long型変数を持つサービスクラスを作成しました

  1. 変数のタイプがlongの場合-初​​期化されていない場合、0に設定されます-GUIで表示される場合、これはユーザーを混乱させます
  2. 変数がLong型である場合-初期化されていない場合、nullに設定されます-このnull値はGUIに表示されません。

これは、Booleanにも適用されます。プリミティブbooleanを使用すると、値がより混乱する可能性があります(デフォルト値はfalseであるため)。

2
Mohamed Afzal

数値計算に支配されているアプリケーションのパフォーマンスは、プリミティブを使用することで大きなメリットが得られます。

プリミティブ型、==演算子を使用しますが、ラッパーの場合、equals()メソッドを呼び出すことをお勧めします。

「有害と見なされるプリミティブ型」 「手続き型セマンティクスを、他の点では統一されたオブジェクト指向モデルに混在させるため」。

多くのプログラマーは、これを示すために数値を0(デフォルト)または-1に初期化しますが、シナリオによっては、これが間違っているか誤解を招く可能性があります。

2
loknath

コレクションを使用する場合は、must Wrapperクラスを使用します。

プリミティブ型は、配列に使用されます。また、カウンターやブール条件など、動作のないデータを表すため。

オートボクシング以来、「プリミティブまたはラッパーを使用する場合」フロンティアは非常に曖昧になりました。

ただし、ラッパーはオブジェクトなので、すべての派手なJava機能を取得できます。たとえば、反射を使用して整数オブジェクトを作成できますが、int値はできません。ラッパークラスにはvalueOfなどのメソッドもあります。 。

1
Tom

値型を作成する場合。 ProductSKUまたはAirportCodeのようなもの。

プリミティブ型(私の例では文字列)が等式を定義するとき、等式をオーバーライドする必要があります。

1
Chris Missal

Javaのプリミティブ値はオブジェクトではありません。これらの値をオブジェクトとして操作するために、Java.langパッケージはプリミティブデータ型ごとにラッパークラスを提供します。

すべてのWrapperクラスはfinalです。インスタンス化できるすべてのラッパークラスのオブジェクトは不変です。つまり、ラッパーオブジェクトの値は変更できません。

ただし、voidクラスはラッパークラスと見なされますが、プリミティブ値をラップせず、飽くことのないものではありません。パブリックコンストラクターはなく、単にキーワードvoidを表すクラスオブジェクトを示します。

0
Ahmad Sayeed