3

以下のように、最終的な整数を初期化するために 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 で必要だったことを理解しています。このタイプのコードの理由は残っていますか? それともただの悪い癖ですか?

4

7 に答える 7

8
  • 1.5 が出る前に書かれたコードはたくさんあります。何のメリットももたらさずにすべてを更新する必要はありません。
  • 場合によっては、ボクシングをしていることがより明確になります。あなたが与えた場合、同じ行でターゲットタイプを簡単に確認できますが、常にそうであるとは限りません。
  • と の両方のオーバーロードを持つメソッドを呼び出したい場合、Integerおよびオーバーロードintを呼び出したい場合Integerは、これが簡単な方法です。
于 2010-07-06T16:38:13.143 に答える
4

In addition to Jon's reasons, some people simply don't like auto (un)boxing, period. There are many nuances to it that some people choose to categorically avoid by prohibiting its use in general through optional compile errors or warnings (Eclipse can turn them into errors or warnings, e.g.)

If that's the case, there isn't much choice besides using the first, even in cases like this where it's not really gaining much.

于 2010-07-06T16:44:17.613 に答える
4

プログラマーは、DAY_1 が int ではなく Integer (オブジェクト) であることを視覚的に強調するために、このように記述することを選択する場合があります。

私はそれを推奨していると言っているわけではありませんが、その理由で誰かがこのアプローチを取っていることは想像できます.

于 2010-07-06T16:37:47.667 に答える
1

コンパイラに関する限り、違いはありません(ただし、引数がオーバーロードされている場合は注意が必要です)。内部的には、DAY_2に表示されるフォームは、コンパイラによってDAY_1に使用されるフォームに単純に変換されます。

人間にとっては違いがあるかもしれません。私は通常、防御的なプログラミングの行為としての自動(アン)ボクシングを避けます。なぜなら、この慣習では、nullの場合を忘れるのが簡単すぎると感じるからです。しかし、実際には、それはあなた次第です。

于 2010-07-06T16:45:12.590 に答える
1

オートボクシングは、見つけるのが非常に難しい非常に微妙なバグにつながる可能性があります。このため、一部のIDEには、任意の種類のボクシング/アンボクシングが使用されたときに警告を生成する機能があります。この警告を消音したい場合は、オプション1が自動的に行います。

つまり、結局のところ、それはすべて個人的な好みとプロジェクトのコーディング標準に帰着します。

この特定のケースでは、オートボクシングを使用する危険はありません。

于 2010-07-06T16:45:24.100 に答える
1

Integer.valueOf(1) は共通値のキャッシュを許可します。-128 から 128 までの値の場合、たとえば常に同じオブジェクトが返されますが、new Integer(1) は常に新しいオブジェクトが返されます。すべての Number 派生型 (Integer、Long、BigDecimal など) にこれを使用することをお勧めします。

Bart van Heukelom によると、list.remove(1) と list.remove(new Integer(1)) の違いは次のとおりです。list.remove(1) は、インデックス 1 のオブジェクトをリストから削除します。list.remove(new Integer(1)) は、値が 1 の Integer オブジェクトに等しいリスト内のすべてのオブジェクトを削除します。コレクションはプリミティブを格納できず、オブジェクトのみを格納することに注意してください。

于 2012-01-09T21:21:17.107 に答える
-1

これは悪い習慣であり、コンパイルによって生成されるため、これを行う理由はありませInteger.valueOf()ん。

于 2010-07-06T16:35:56.550 に答える