Java의 숫자 클래스에 new 및 생성자를 사용하는 정당한 이유가 있습니까?

StackOverflow https://stackoverflow.com/questions/1009087

  •  06-07-2019
  •  | 
  •  

문제

Java에서 다음과 같은 정당한 이유가 있습니까?

Long l = new Long(SOME_CONSTANT)

이는 추가 개체를 생성하고 FindBugs에 의해 태그가 지정되며 분명히 나쁜 습관입니다.내 질문은 그렇게 할 타당한 이유가 있는지 여부입니다.

나는 이전에 String 생성자에 대해 질문했고 좋은 답변을 받았습니다., 하지만 그 대답은 숫자에는 적용되지 않는 것 같습니다.

도움이 되었습니까?

해결책

고유 한 인스턴스를 얻으려면 거의 절대.

자가 옥스가있을 때 일부 숫자를 캐시 할 수 있습니다 (그러나 Longs 보장되지 않습니다), 문제가 발생할 수 있습니다. 그러나 캐싱으로 인해 깨질 수있는 모든 코드에는 더 깊은 문제가있을 수 있습니다. 지금 당장은 유효한 사례를 생각할 수 없습니다.

다른 팁

내 질문은 그렇게해야 할 좋은 이유가 있는지 여부입니다.

이전 JRE와 호환되는 코드를 작성하려는 경우에도 여전히 사용할 수 있습니다. (Long)의 가치 Java 1.5에서만 소개되었습니다 Java 1.4 그리고 생성자가 a . 생성자가 여전히 내부적으로 사용되기 때문에 더 이상 사용되지 않는 것으로 기대합니다.

내가 생각할 수 있는 유일한 것은 박싱을 명시적으로 만드는 것입니다. 하지만 동등한 자동 박싱 코드는 실제로 작은 값을 캐시할 수 있는 Long.valueOf(SOME_CONSTANT)로 컴파일됩니다.(jvm src에서)

   public static Long valueOf(long l) {
    final int offset = 128;
    if (l >= -128 && l <= 127) { // will cache
        return LongCache.cache[(int)l + offset];
    }
        return new Long(l);
  }

.큰 문제는 아니지만 유형을 고려하지 않고 계속해서 박스를 넣고 언박싱하는 코드가 엉성해질 수 있는 것을 싫어합니다.

하지만 기능적으로는 어떤 면에서든 차이를 찾을 수 없습니다.새로운 long은 여전히 ​​동일하고 해시코드가 자동 박싱된 것과 동일하게 계산되므로 원하는 경우 어떻게 기능적 구별을 할 수 있는지 알 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top