기본 유형보다 래퍼 클래스를 사용해야 할 때가 있습니까? 또는 어떤 상황에서 래퍼 / 프리미티브 유형 중에서 선택해야합니까?
답변:
다른 사람들은 Collections
객체가 필요하고 객체가 원시 대응 물 (메모리 및 권투)보다 오버 헤드가 더 많다는 것과 같은 특정 구조를 언급했습니다 .
또 다른 고려 사항은 다음과 같습니다.
객체를 초기화 null
하거나 null
메서드 / 생성자에 매개 변수를 보내 상태 또는 기능을 나타내는 것이 편리 할 수 있습니다 . 이것은 프리미티브로는 할 수 없습니다.
많은 프로그래머가이를 나타 내기 위해 숫자를 0 (기본값) 또는 -1로 초기화하지만 시나리오에 따라 잘못되거나 오해의 소지가있을 수 있습니다.
이것은 또한 NullPointerException
무언가가 잘못 사용되는 경우에 대한 장면을 설정합니다. 이것은 임의의 버그보다 훨씬 더 프로그래머 친화적입니다.
Integer
보다 읽기 쉬운입니다 int
.
내 생각에 클래스 멤버가 래퍼 변수이면 개발자 친화적 인 동작 인 기본값에 의존하지 않습니다.
1.
class Person {
int SSN ; // gets initialized to zero by default
}
2.
class PersonBetter {
Integer SSN; //gets initialized to null by default
}
첫 번째 경우에는 SSN 값을 초기화하지 않은 상태로 유지할 수 없습니다. 사용하기 전에 값이 설정되었는지 확인하지 않으면 손상 될 수 있습니다.
두 번째 경우에는 SSN을 null로 초기화 할 수 있습니다. NullPointerException이 발생할 수 있지만 SSN 필드를 초기화하지 않고 사용하려고 할 때마다 무의식적으로 기본값 (0)을 SSN으로 데이터베이스에 삽입하는 것보다 낫습니다.
PersonBuilder
를 가져 오기 위해 "build"를 호출하기 전에 SSN이 설정되지 않은 경우 예외를 throw하는를 만듭니다 Person
. 나는 이런 종류의 것이 과도하다고 생각하지만 Java 언어가 적절한 패턴을 장려하는 것입니다.
필요한 경우에만 래퍼 유형을 사용합니다.
그것들을 사용함으로써 당신은 그들이 있다는 사실 외에 많은 것을 얻지 못합니다 Objects
.
또한 메모리 사용량과 boxing / unboxing에 소요되는 시간의 오버 헤드를 잃게됩니다.
컬렉션은 단순한 Java 래퍼 개체의 일반적인 경우입니다. 그러나 코드 (값 개체)에서 래퍼에보다 구체적인 의미를 부여하는 것을 고려할 수 있습니다.
IMHO는 코드의 가독성과 유지 관리로 귀결 될 때 값 객체를 사용하는 데 거의 항상 이점이 있습니다. 특정 책임이있는 객체 내부에 간단한 데이터 구조를 래핑하면 코드가 단순화되는 경우가 많습니다. 이것은 Domain-Driven Design 에서 매우 중요한 것입니다 .
물론 성능 문제가 있지만 적절한 데이터로 성능을 측정하고 문제 영역에 대한보다 직접적인 조치를 취할 수있을 때까지이를 무시하는 경향이 있습니다. 코드도 이해하기 쉬운 경우 성능 문제를 이해하는 것이 더 쉬울 수도 있습니다.
수치 계산이 지배하는 응용 프로그램의 성능 은 프리미티브를 사용하여 큰 이점을 얻을 수 있습니다.
기본 유형 에서는 == 연산자를 사용하지만 래퍼의 경우 선호되는 선택은 equals () 메서드를 호출하는 것입니다.
"유해한 것으로 간주되는 원시 유형 "은 "절차 적 의미를 통일 된 객체 지향 모델로 혼합하기 때문입니다."
많은 프로그래머가이를 나타 내기 위해 숫자를 0 (기본값) 또는 -1로 초기화하지만 시나리오에 따라 잘못되거나 오해의 소지가있을 수 있습니다.
컬렉션을 사용 하려면 래퍼 클래스 를 사용해야합니다 .
기본 유형은 배열에 사용됩니다. 또한 동작이없는 데이터 (예 : 카운터 또는 부울 조건)를 나타냅니다.
오토 박싱 이후, "프리미티브 또는 래퍼를 사용해야하는 경우"경계가 매우 모호해졌습니다.
그러나 Wrappers는 객체이므로 모든 멋진 Java 기능을 사용할 수 있습니다. 예를 들어 반사를 사용하여 Integer 개체를 만들 수 있지만 int 값은 만들 수 없습니다. 래퍼 클래스에는 valueOf와 같은 메서드도 있습니다.
값 유형을 생성하려는 경우. ProductSKU 또는 AirportCode와 같은 것입니다.
기본 유형 (내 예제의 문자열)이 동등성을 정의 할 때 동등성을 재정의하고 싶을 것입니다.