Forループで使用されるサイズをキャプチャする整数変数を使用するクラスに出会いました。これは良い習慣ですか、またはintプリミティブデータ型を使用する必要がありますか?
Integer size = something.getFields().size();
for (Integer j = 0; j < size - 1; ++j)
整数クラスは、値を純粋なOOの方法でボックス化/ボックス化解除できるように提供されます。特にOO = way;この場合、整数が適切です。
ただし、ここではカバーの下で非常に異なることが行われています。 intは数値です。 >整数は、数値を含むオブジェクトを参照できるポインターです。
...
Intはオブジェクトではないため、オブジェクトを必要とするメソッドに渡すことはできません。一般的なケースは、提供されたコレクションクラス(List、Map、Set)の使用です。ただし、オブジェクトバージョンと同様の機能を提供するこれらのクラスのバージョンを記述することは可能です。イントロスペクションが使用される場合(リフレクションAPIなど)には、ラッパークラス(Integer、Doubleなど)が頻繁に必要になります。
一方を使用する場合と他方を使用する場合のより良い説明:
IntとIntegerの選択
理由を詳しく説明する前に、これらのタイプの使用方法から始めます。
- パフォーマンス上の理由から
int
を優先する- オブジェクト(_
List<T>
_などのジェネリック型を含む)を受け取るメソッドは、暗黙的にIntegerの使用を必要としますInteger
の使用は、インターンのために低い値(-128〜127)で比較的安価です-新しいInteger(int)ではなくInteger.valueOf(int)
を使用してください- 整数型で_
==
_または_!=
_を使用しないでください- 値がないことを表す必要がある場合(null)
Integer
の使用を検討してください- 整数値をnull値でintにアンボックス化することに注意
int
を使用できる場合は、そうします。値がnull
になる可能性がある場合、またはオブジェクトとして使用される場合ジェネリック、Integer
を使用
通常、どちらを使用してもかまいませんが、多くの場合、int
の方がわずかに優れています。
このアプローチは実際には良くありません。可能な限りint
を使用してください。 Integer
の使用法は、この特定の変数がnull
(またはコレクション内にある、ジェネリックを気にする...)になる可能性があることを示しますが、そうではありません。
また、Integer
を使用すると、ボクシングとアンボクシングの余分なオーバーヘッドが発生します。
これは、大規模プロジェクトで発生する可能性のある潜在的な災害です。ここでのコーダーは、各Integerが実際には新しいオブジェクトであることを忘れていました。intとして使用するには、常にボックス化とボックス化解除が必要です。効率が悪いだけでなく、期待どおりに動作しません。可能な場合は常にintを使用し、これらの値をリスト、コンテナ、またはデータベースストレージに配置する場合にのみIntegerを使用することをお勧めします。 >、<、および==を使用してオブジェクトを比較することは、同じ演算子を使用してプリミティブを比較する場合とは異なることを意味することに注意してください。
ループのみに使用しないでください。プリミティブ型int(パフォーマンスの向上)を使用します。これはClass Integerとは異なります。
Integerクラスは、プリミティブ型intの値をオブジェクトにラップします。タイプIntegerのオブジェクトには、タイプがintである単一のフィールドが含まれます。
さらに、このクラスは、intをStringに、Stringをintに変換するためのいくつかのメソッド、およびintを扱うときに役立つ他の定数とメソッドを提供します。
そのため、Integer関数を呼び出す必要がある場合、またはNULL値を割り当てる必要がある場合は、Integerを使用します。
Listのようなジェネリックには、intではなくIntegerを使用する必要もあります。
オブジェクトを使用する必要がある場合、Integer、Double、FloatなどのWrapperクラスを使用する必要があります。
例えば:
int n = Integer.parseInt("10");
ここでは、文字列を整数(プリミティブ型)に変換していますが、メソッドparseInt(String str)はWrapperクラス(つまり、Object)でのみ機能するため、使用しました。
プリミティブ型と参照型の間の変換のオーバーヘッドが発生するため、ボックス化とボックス化解除によりパフォーマンスが低下する可能性があります。
ただし、Integerクラスには、非常に便利なメソッドが追加されています。
可能な場合は常に、プリミティブ型を昇格させます。
プリミティブ型はGenericArgumentまたはnullとして使用できません。
純粋にオブジェクト指向であるため、通常Integerを使用します。 intのパフォーマンスは、オブジェクトの同等物よりも間違いなくはるかに優れていますが、ループ内で何百万回もループしている場合にのみ顕著です。
私見、アプリケーションでパフォーマンスが最も重要であり、1ナノ秒でも絞る場合は、脳なしでintを使用します。ただし、OOで読みやすさが重要な場合は、整数を使用します。