기본 유형보다 래퍼 클래스를 사용해야 할 때가 있습니까? 또는 어떤 상황에서 래퍼 / 프리미티브 유형 중에서 선택해야합니까?
답변:
다른 사람들은 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와 같은 것입니다.
기본 유형 (내 예제의 문자열)이 동등성을 정의 할 때 동등성을 재정의하고 싶을 것입니다.