回答:
他の人はCollections
、オブジェクトを必要とするような特定の構造や、オブジェクトはそれらの基本的な対応物(メモリとボクシング)よりもオーバーヘッドが多いと述べています。
別の考慮事項は次のとおりです。
オブジェクトを初期化しnull
たりnull
、メソッドやコンストラクターにパラメーターを送信して、状態や機能を示すと便利です。これはプリミティブでは実行できません。
多くのプログラマーは、これを示すために数値を0(デフォルト)または-1に初期化しますが、シナリオによっては、これが正しくないか、誤解を招く可能性があります。
これはまたNullPointerException
、何かが誤って使用されているときにシーンを設定します。これは、将来の任意のバグよりもはるかにプログラマーフレンドリーです。
一般に、なんらかの理由(たとえば、コレクションに入れるなど)でオブジェクトが必要でない限り、プリミティブ型を使用する必要があります。それでも、数値パフォーマンスを最大化したい場合は、オブジェクトを必要としない別のアプローチを検討してください。これはドキュメントで推奨されており、この記事では、オートボクシングがパフォーマンスに大きな違いをもたらす方法を示しています。
Integer
より読みやすい方法を説明してくださいint
。
私の意見では、クラスメンバーがラッパー変数である場合、デフォルト値に依存しません。これは、開発者が使いやすい動作です。
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をnullで初期化しておくことができます。これはNullPointerExceptionを引き起こす可能性がありますが、SSNフィールドを初期化せずに使用しようとするたびに、無意識のうちにデフォルト値(ゼロ)をSSNとしてデータベースに挿入するよりも優れています。
PersonBuilder
は、Person
インスタンスを取得するために「ビルド」を呼び出す前にSSNが設定されていない場合に例外をスローするを作成します。この種のことは過剰だと思いますが、それはJava言語が適切なパターンを促進するためのものです。
必要な場合にのみ、ラッパータイプを使用します。
それらを使用することで、彼らがそうであるという事実を除いて、あなたは多くを得ませんObjects
。
また、メモリ使用量のオーバーヘッドと、ボックス化/ボックス化解除に費やされた時間を失うことになります。
コレクションは、単純なJavaラッパーオブジェクトの典型的な例です。ただし、コード(値オブジェクト)でWrapperに特定の意味を与えることを検討する場合があります。
私見ほとんどの場合、コードの可読性と保守性に要約すると、値オブジェクトを使用する利点があります。オブジェクトに特定の責任がある場合、オブジェクト内で単純なデータ構造をラップすると、コードが単純化されることがよくあります。これは、ドメイン駆動設計で非常に重要なことです。
もちろんパフォーマンスの問題もありますが、適切なデータを使用してパフォーマンスを測定し、問題のある領域に向けたより具体的なアクションを実行できるようになるまで、それを無視する傾向があります。コードも理解しやすいと、パフォーマンスの問題も理解しやすくなります。
パフォーマンス数値計算が支配的なアプリケーションのは、プリミティブを使用することで大きなメリットが得られます。
プリミティブ型、は==演算子を使用しますが、ラッパーの場合、equals()メソッドを呼び出すことをお勧めします。
「有害と見なされるプリミティブタイプ」、「手続き型の意味論を他の点では均一なオブジェクト指向モデルに混合するため」。
多くのプログラマーは、これを示すために数値を0(デフォルト)または-1に初期化しますが、シナリオによっては、これが正しくないか、誤解を招く可能性があります。
コレクションを使用する場合は、Wrapperクラスを使用する必要があります。
プリミティブ型は、配列に使用されます。また、カウンターやブール条件など、動作のないデータを表すため。
オートボクシング以降、「プリミティブまたはラッパーをいつ使用するか」というフロンティアはかなりあいまいになりました。
ただし、ラッパーはオブジェクトであるため、Javaの優れた機能をすべて利用できることを忘れないでください。たとえば、リフレクションを使用してIntegerオブジェクトを作成できますが、int値は作成できません。ラッパークラスには、valueOfなどのメソッドもあります。
値タイプを作成する場合。ProductSKUやAirportCodeなど。
プリミティブ型(私の例では文字列)が同等性を定義している場合、同等性をオーバーライドする必要があります。