プリミティブ型のラッパークラスを使用する場合または、どのような状況でラッパー/プリミティブ型を選択する必要がありますか?
他の人は、Collections
などの特定の構造体にはオブジェクトが必要であり、オブジェクトには対応するプリミティブ(メモリとボクシング)よりもオーバーヘッドが大きいと述べています。
別の考慮事項は次のとおりです。
オブジェクトをnull
に初期化するか、null
パラメーターをメソッド/コンストラクターに送信して、状態または機能を示すと便利です。これはプリミティブでは実行できません。
多くのプログラマーは、これを示すために数値を0(デフォルト)または-1に初期化しますが、シナリオによっては、これが間違っているか誤解を招く可能性があります。
これはまた、何かが間違って使用されているときにNullPointerException
のシーンを設定します。これは、将来の任意のバグよりもはるかにプログラマーに優しいものです。
私の意見では、クラスメンバーがラッパー変数である場合、デフォルト値に依存しません。これは、開発者にとって使いやすい動作です。
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としてデータベースに挿入するよりも優れています。
必要な場合にのみラッパータイプを使用します
それらを使用しても、Objects
であるという事実以外はあまり得られません。
また、メモリ使用量とボクシング/アンボクシングに費やされた時間のオーバーヘッドを失います。
コレクションは、単純なJavaラッパーオブジェクトの典型的なケースです。ただし、コード(値オブジェクト)でラッパーに特定の意味を与えることを検討することもできます。
私見では、コードの可読性と保守性に帰着するとき、値オブジェクトを使用することはほとんど常に利点があります。オブジェクトに特定の責任があるときに単純なデータ構造をラップすると、多くの場合コードが簡素化されます。これは Domain-Driven Design で非常に重要なことです。
もちろんパフォーマンスの問題もありますが、適切なデータを使用してパフォーマンスを測定し、問題のある領域に向けてより指示されたアクションを実行できるようになるまで、それを無視する傾向があります。また、コードも理解しやすい場合、パフォーマンスの問題を理解しやすくなる場合があります。
実際には、ラッパークラスの使用を説明できる状況に遭遇しました。
long
型変数を持つサービスクラスを作成しました
long
の場合-初期化されていない場合、0に設定されます-GUIで表示される場合、これはユーザーを混乱させますLong
型である場合-初期化されていない場合、null
に設定されます-このnull値はGUIに表示されません。これは、Boolean
にも適用されます。プリミティブboolean
を使用すると、値がより混乱する可能性があります(デフォルト値はfalseであるため)。
数値計算に支配されているアプリケーションのパフォーマンスは、プリミティブを使用することで大きなメリットが得られます。
プリミティブ型、==演算子を使用しますが、ラッパーの場合、equals()メソッドを呼び出すことをお勧めします。
「有害と見なされるプリミティブ型」 「手続き型セマンティクスを、他の点では統一されたオブジェクト指向モデルに混在させるため」。
多くのプログラマーは、これを示すために数値を0(デフォルト)または-1に初期化しますが、シナリオによっては、これが間違っているか誤解を招く可能性があります。
コレクションを使用する場合は、must Wrapperクラスを使用します。
プリミティブ型は、配列に使用されます。また、カウンターやブール条件など、動作のないデータを表すため。
オートボクシング以来、「プリミティブまたはラッパーを使用する場合」フロンティアは非常に曖昧になりました。
ただし、ラッパーはオブジェクトなので、すべての派手なJava機能を取得できます。たとえば、反射を使用して整数オブジェクトを作成できますが、int値はできません。ラッパークラスにはvalueOfなどのメソッドもあります。 。
値型を作成する場合。 ProductSKUまたはAirportCodeのようなもの。
プリミティブ型(私の例では文字列)が等式を定義するとき、等式をオーバーライドする必要があります。
Javaのプリミティブ値はオブジェクトではありません。これらの値をオブジェクトとして操作するために、Java.langパッケージはプリミティブデータ型ごとにラッパークラスを提供します。
すべてのWrapperクラスはfinalです。インスタンス化できるすべてのラッパークラスのオブジェクトは不変です。つまり、ラッパーオブジェクトの値は変更できません。
ただし、voidクラスはラッパークラスと見なされますが、プリミティブ値をラップせず、飽くことのないものではありません。パブリックコンストラクターはなく、単にキーワードvoidを表すクラスオブジェクトを示します。