質問
以下のように、integer.valueof(x)を使用して最終整数を初期化する理由はありますか。
public class MyClass
{
public static final Integer DAY_1 = Integer.valueOf(1); // Why do it this way?
public static final Integer DAY_2 = 2; // When it can be done this way?
}
これは、自動ボクシングが追加される前に、Javaの古いバージョンで必要であることを理解しています。このタイプのコードの理由は残りますか?それともただの悪い習慣ですか?
解決
- 1.5が発表される前に書かれたコードがたくさんあります。利益をもたらすことなく、すべてを更新する必要はありません。
- 場合によっては、あなたを明確にします それは ボクシング。あなたが与えた場合、あなたはあなたが同じ行でターゲットタイプを簡単に見ることができます - しかし、それは必ずしもそうではありません。
- 両方に過負荷を持っているメソッドを呼び出したい場合
Integer
とint
そして、あなたは電話したいですInteger
過負荷、これは簡単な方法です。
他のヒント
プログラマーは、day_1がintではなく整数(オブジェクト)であることを視覚的に強調するために、このように書くことを選択する場合があります。
私はそれをお勧めしていると言っているわけではありませんが、その理由でこのアプローチを取っている人を想像できました。
ジョンの理由に加えて、一部の人々は単に自動(un)ボクシング、期間が好きではありません。オプションのコンパイルエラーまたは警告を通じて一般的に使用を禁止することにより、一部の人々がその使用を断言することを選択する人もいる多くのニュアンスがあります(Eclipseはエラーや警告に変えることができます)
その場合、このような場合でも、実際にはあまり得られていない場合でも、最初のものを使用する以外には多くの選択肢がありません。
コンパイラに関する限り、違いはありません(ただし、過負荷の引数の場合はケアを使用する必要があります)。ボンネットの下では、day_2に表示されるフォームは、コンパイラがDay_1に使用するフォームに単純に変換されます。
人間には違いがあるかもしれません。私は通常、防御プログラミングの行為としてAuto(Un)ボクシングを避けます。これは、ヌルのケースを忘れがちであまりにも簡単だと感じているからです。しかし、本当に、それはあなた次第です。
オートボクシングは、非常に微妙なバグにつながる可能性があり、それは非常に難しいかもしれません。このため、一部のIDEには、ボクシング/ボクシングが使用されている場合に警告を生成する能力があります。この警告を黙らせたい場合は、オプション1があなたのためにそれを行います。
したがって、最終的には、すべてが個人的な好みとプロジェクトのコーディング基準に帰着します。
この特定のケースでは、自動ボクシングを使用する危険はありません。
integer.valueof(1)により、共通の値のキャッシュが可能になります。 -128から128の値の場合、たとえば同じオブジェクトを常に返しますが、新しい整数(1)は常に新しいオブジェクトを返します。とにかくオートボクシングがカバーの下で行っていることであるにもかかわらず、これをすべての数の派生タイプ(整数、長い、大きなdecなど)に使用することは良い習慣だと思います。
Bart van Heukelom、list.remove(1)とlist.remove(new Integer(1))の違いはこれです。 List.Remove(1)は、index 1のオブジェクトをリストから削除します。list.remove(new Integer(1))は、値の整数オブジェクトに等しいリスト内のすべてのオブジェクトを削除します。コレクションはプリミティブを保存することはできず、オブジェクトのみを保存できないことを忘れないでください。
それは悪い習慣であり、コンパイルが生成するのでそれをする理由はありません Integer.valueOf()
あなたのために。