2013-08-30 6 views
14

は最近、私は人々が私は1つは、読みやすさに関する個人的な好みを除いて、これを実行する理由見当もつかないなぜ長いリテラルではなく、Long.valueOf(...)を使用するのですか?

Long myLong = Long.valueOf(42); 

// instead of 

Long myLong = 42L; 

ようなものを記述したコードの上につまずきました。

何か不足していますか?

+15

おそらく彼らは '42L'構文を認識していないからです。 –

+1

おそらく著者は長いリテラルについて知らなかったでしょう。あなたが使用する場合 – Henry

+0

何が起こることは、あなたが「オブジェクト」の本能で行くである「ロング」そうメソッドを使用する傾向があり、プラス@MagnusGrindalBakkenが言ったことと同じで、私は私の自己はそれを試したことがない:私たちはへのFindBugsを使う仕事P –

答えて

12

直接割り当てが必要ですintLongintからプリミティブlongまでを暗黙に指定)に割り当てるとキャストし、g自動的Long.valueOf

Long myLong1 = Long.valueOf(42); 
    Long myLong2 = Long.valueOf(42L); 
    Long myLong3 = 42L; 
    Long myLong4 = (long) 42; 

を使用してらautoboxedは、そうでない場合は、すべてのjavap

public static void main(java.lang.String[]); 
    Code: 
     0: ldc2_w  #16     // long 42l 
     3: invokestatic #18     // Method java/lang/Long.valueOf:(J)Ljava/lang/Long; 
     6: astore_1  
     7: ldc2_w  #16     // long 42l 
     10: invokestatic #18     // Method java/lang/Long.valueOf:(J)Ljava/lang/Long; 
     13: astore_2  
     14: ldc2_w  #16     // long 42l 
     17: invokestatic #18     // Method java/lang/Long.valueOf:(J)Ljava/lang/Long; 
     20: astore_3  
     21: ldc2_w  #16     // long 42l 
     24: invokestatic #18     // Method java/lang/Long.valueOf:(J)Ljava/lang/Long; 
     27: astore  4 
     29: return   

からバイトコード出力は、しかしnew Long(42L)を使用すると、同じ避けるべきで参照されていない場合は絶対に必要と上記の文の一つが使用する必要がありますvalueOfの方法では、内部的にJVMによって値の範囲(FlyWeight Design Pattern)をキャッシュします。

トリビア:整数の場合は限り-XX:AutoBoxCacheMax=

+1

@chrylisはい購入しないオートボクシング。 http://docs.oracle.com/javase/6/docs/api/: ' –

1

valueOfは、プリミティブlongをとります。リテラルについては、42Lがより良いことに同意しますが、intまたはlongという変数がある場合は、Long.valueOfLongを得る良い方法です。 valueOfは-128から127までの値のキャッシュも使用します。これにより、一般的な値に対してはnew Long(long)より若干パフォーマンスが向上します。彼らが等価である

+0

プリミティブなロング変数で代入を使うこともできます。それでも同じでなければなりません( 'Long myLong = myPrimitiveLong;') – Puce

+0

@Puce hm、良い点。しかし、Long.valueOf(myPrimitive).compareTo(otherPrimitive)のように、 'Long'でインスタンスメソッドを呼びたい場合には、これはまだ便利です。他の何らかの理由で、必ずしもプリミティブに割り当てる必要はなく、 'Long'を必要とします。 –

2

は、コンパイラは同じバイトコードを生成します

Long myLong = Long.valueOf(42); 

コンパイラとして両方

+1

それは本当ですか? –

+2

@DavidWallaceはい答えに 'javap'の出力を見てください。 –

3

ため

Long myLong = 42L; 

が内部的に同じであるスニペットを同じバイトコードを構築します。

1

あなたが気づいていない人は、他の方法でそれをすることができますか?

コンパイラが定数呼び出しのために同じバイトコードにLong.valueOfを変換するほどスマートであるかどうか疑問に思っています。さもなければ、小さなパフォーマンス・ヒット(重要ではありませんが、頻繁に実行され、タイトなループに気付くかもしれません)。 (INT)longBiggerThanIntCanHandle

のvalueOfのバージョンでは、プリミティブ型間のキャストの束をやっているし、(例えば)問題を引き起こすことにしたくない場合に便利、安全にプリミティブ値をキャストするのに便利です

(あなたは(long)intValueを気にしませんが、両方の方法でコンバージョンを行う場合は、安全のためにvalueOfを規約として使用することをお勧めします)

-3

を使用して制御することができ&のOracle JVM範囲。valueOfメソッドは、頻繁に要求される値をキャッシュすることで、より優れた領域と時間のパフォーマンスを実現します。 Long.valueOfは-128〜127の値をキャッシュし、これらの値は再利用できます。

割り当ての場合、毎回新しいオブジェクトが作成されます。

valueOfメソッドは文字列の場合には動作が異なります。

+0

参照のPrashant Bhate – Puce

2

私もそれはオートボクシングがありませんでしたjava5前のJavaのリマインダー、だと思う、とどこ

Long l = 42L; 

をコンパイルすることができませんでした。

+0

のしかし、Java5の前に答え、何のvalueOf(長い)がなかったのいずれか:) – Durandal

+0

確か;'ロングmyLong4 = 42を試してみてくださいjava/lang/Long.html#valueOf(long) – chburd

関連する問題