2012-04-23 4 views
4

래퍼 유형에 프리미티브 값을 직접 할당하고 valueOf API를 사용하는 경우의 차이점은 무엇입니까? 즉래퍼 클래스에 프리미티브 값을 할당하는 올바른 방법

Long val = 91l; 

Long val = Long.valueOf(91l); 

이 질문은 내가 지금 일에 머리를 깨는 된 버그에서 발생한다. 지금까지 나는 그것을 성공적으로 재현 할 수 없었고 무작위로 나왔습니다. 나는 어떤 데이터를 처리하는 과정에서 생성되는 객체를 가지고 있는데,이 객체는 값이 모든 변수에 할당되어 있다고 확신하는 Long (Wrapper) 유형의 여러 필드를 가지고 있지만 어떤 경우에는 그냥 그 이유가없는 경우에도 NULL이 나옵니다.

이 질문과 관련된 방식은이 Long 특성의 Set 메서드가 실제로 long 형식 (기본)의 인수를 취하여 첫 번째 방법을 사용하여 할당 된 것입니다. 그것이 그 원인이 될 수 있는지 확실하지 않습니다. 나는 두 번째 접근법으로 코드를 수정했고, 좋은 테스트가 끝나기를 기다리고 나서 해결하기를 기뻐한다.

나는 위에서 언급 한 두 가지 방법에 이론적 인 차이가 있는지 알고 싶어합니다. (나는 보통 대부분의 시간을 사용한다.)

답변

8

두 줄은 적어도 내가 본 모든 컴파일러에서 같은 바이트 코드로 컴파일 될 것이다. 문제가 어디에서 발생했는지는 분명하지 않지만 거기에 없습니다. (이것은 값 생성 방법 사양 보장하지는 않았지만, 결과는 longValue() 방법 일본어 프리미티브 값을 반환하도록 대상이 보장된다.) 예를 들어

, 디 컴파일을이 방법 :

static void foo() { 
    Long val1 = 91L; 
    Long val2 = Long.valueOf(91L); 
} 

함께 끝 :

static void foo(); 
    Code: 
    0: ldc2_w #2; //long 91l 
    3: invokestatic #4; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long; 
    6: astore_0 
    7: ldc2_w #2; //long 91l 
    10: invokestatic #4; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long; 
    13: astore_1 
    14: return  
} 

(작은 점으로, 나는 접미사로 소스 코드에 L보다는 l를 사용하는 것이 좋습니다 것 - l은 글꼴에 따라 1과 매우 비슷합니다.

관련 문제