プリミティブ型よりもラッパークラスを選択する必要があるのはいつですか?または、どのような状況でラッパー/プリミティブタイプから選択する必要がありますか?
11 に答える
他の人は、requireオブジェクトなどの特定の構造Collections
、およびオブジェクトはそれらのプリミティブな対応物(メモリとボクシング)よりもオーバーヘッドが大きいと述べています。
もう1つの考慮事項は次のとおりです。
null
オブジェクトを初期化するか、メソッド/コンストラクターにパラメーターを送信null
して、状態または関数を示すと便利な場合があります。これは、プリミティブでは実行できません。
多くのプログラマーは、これを示すために数値を0(デフォルト)または-1に初期化しますが、シナリオによっては、これが正しくないか、誤解を招く可能性があります。
これにより、何かが誤って使用されている場合のシーンも設定されますNullPointerException
。これは、将来の任意のバグよりもはるかにプログラマーにとって使いやすいものです。
私の意見では、クラスメンバーがラッパー変数である場合、開発者にとって使いやすいデフォルト値に依存しません。
1.1。
class Person {
int SSN ; // gets initialized to zero by default
}
2.2。
class PersonBetter {
Integer SSN; //gets initialized to null by default
}
最初のケースでは、SSN値を初期化しないままにすることはできません。使用する前に値が設定されているかどうかを確認していないと、問題が発生する可能性があります。
2番目のケースでは、SSNをnullで初期化したままにすることができます。これはNullPointerExceptionにつながる可能性がありますが、SSNフィールドを初期化せずに使用しようとするたびに、SSNとしてデフォルト値(ゼロ)をデータベースに無意識のうちに挿入するよりも優れています。
必要な場合にのみラッパータイプを使用します。
それらを使用することで、それらがであるという事実以外に、あなたは多くを得ることができませんObjects
。
また、メモリ使用量とボクシング/アンボクシングに費やした時間のオーバーヘッドが失われます。
実際、ラッパークラスの使用を説明できる状況に遭遇しました。
long
型変数を持つサービスクラスを作成しました
- 変数のタイプが
long
-初期化されていない場合は0に設定されます-これはGUIに表示されたときにユーザーを混乱させるでしょう - 変数のタイプが
Long
-初期化されていない場合は-に設定されnull
ます-このnull値はGUIに表示されません。
Boolean
これは、プリミティブを使用するときに値がより混乱する可能性がある場合にも当てはまりboolean
ます(デフォルト値はfalseであるため)。
コレクションは、単純なJavaラッパーオブジェクトの典型的なケースです。ただし、コード(値オブジェクト)でラッパーにさらに具体的な意味を与えることを検討することもできます。
私見では、コードの可読性と保守性に要約すると、値オブジェクトを使用することにはほとんどの場合利点があります。オブジェクトが特定の責任を負っているときにオブジェクト内で単純なデータ構造をラップすると、多くの場合、コードが単純化されます。これは、ドメイン駆動設計で非常に重要なことです。
もちろんパフォーマンスの問題はありますが、適切なデータを使用してパフォーマンスを測定し、問題のある領域に対してより適切なアクションを実行できるようになるまで、それを無視する傾向があります。コードも理解しやすい場合は、パフォーマンスの問題も理解しやすいかもしれません。
数値計算が支配的なアプリケーションのパフォーマンスは、プリミティブを使用することで大きなメリットが得られます。
プリミティブ型の場合、==演算子を使用しますが、ラッパーの場合は、equals()メソッドを呼び出すことをお勧めします。
「プリミティブ型は有害であると見なされます」。これは、「手続き型セマンティクスを他の点では均一なオブジェクト指向モデルに混合するため」です。
多くのプログラマーは、これを示すために数値を0(デフォルト)または-1に初期化しますが、シナリオによっては、これが正しくないか、誤解を招く可能性があります。
コレクションを使用する場合は、ラッパークラスを使用する必要があります。
プリミティブ型は、配列に使用されます。また、カウンターやブール条件などの動作を持たないデータを表すため。
オートボクシング以来、「プリミティブまたはラッパーをいつ使用するか」のフロンティアはかなり曖昧になっています。
ただし、ラッパーはオブジェクトであるため、Javaの優れた機能をすべて利用できることを忘れないでください。たとえば、reflexionを使用してIntegerオブジェクトを作成できますが、int値を作成することはできません。ラッパークラスには、valueOfなどのメソッドもあります。
値型を作成する場合。ProductSKUやAirportCodeのようなもの。
プリミティブ型(私の例では文字列)が等式を定義する場合、等式をオーバーライドする必要があります。
Javaのプリミティブ値はオブジェクトではありません。これらの値をオブジェクトとして操作するために、java.langパッケージは各プリミティブデータ型のラッパークラスを提供します。
すべてのラッパークラスは最終的なものです。開始できるすべてのラッパークラスのオブジェクトは不変です。つまり、ラッパーオブジェクトの値は変更できません。
ただし、voidクラスはラッパークラスと見なされますが、プリミティブ値をラップせず、開始できません。パブリックコンストラクタはなく、キーワードvoidを表すクラスオブジェクトを示しているだけです。
プリミティブ型を使用する場合
- 大量の計算を行う場合、プリミティブ型は常に高速であり、オーバーヘッドがはるかに少なくなります。
- 変数をnullにできないようにする場合。
- デフォルト値をnullにしたくない場合。
- メソッドが値を返す必要がある場合
ラッパークラスを使用する場合
- コレクションまたはジェネリックを使用している場合—必須です
- タイプのMIN_SIZEまたはMAX_SIZEが必要な場合。
- 変数をnullにできるようにしたい場合。
- デフォルト値をnullにしたい場合。
- 場合によっては、メソッドがnull値を返すことがあります。
https://medium.com/@bpnorlander/java-understanding-primitive-types-and-wrapper-objects-a6798fb2afe9から