래퍼 클래스 및 기본 유형을 사용하는 경우
기본 유형보다 래퍼 클래스를 사용해야 할 때는 언제입니까? 또는 어떤 상황에서 래퍼 / 프리미티브 유형 중에서 선택해야합니까?
다른 사람들은 Collections
객체가 필요하고 객체가 원시 대응 물 (메모리 및 권투)보다 오버 헤드가 더 많다는 것과 같은 특정 구조를 언급했습니다 .
또 다른 고려 사항은 다음과 같습니다.
객체를 초기화 null
하거나 null
메서드 / 생성자에 매개 변수를 보내 상태 또는 기능을 나타내는 것이 편리 할 수 있습니다 . 이것은 프리미티브로는 할 수 없습니다.
많은 프로그래머가이를 나타 내기 위해 숫자를 0 (기본값) 또는 -1로 초기화하지만 시나리오에 따라 잘못되거나 오해의 소지가있을 수 있습니다.
이것은 또한 NullPointerException
무언가가 잘못 사용되는 경우에 대한 장면을 설정합니다. 이것은 임의의 버그보다 훨씬 더 프로그래머 친화적입니다.
일반적으로 (컬렉션에 넣는 등) 어떤 이유로 객체 가 필요 하지 않으면 기본 유형을 사용해야합니다 . 그럼에도 불구하고 수치 성능을 극대화하려면 객체가 필요하지 않은 다른 접근 방식을 고려하십시오. 이는 문서 에서 권장하며이 문서 에서는 자동 박싱이 어떻게 큰 성능 차이를 유발할 수 있는지 보여줍니다.
내 생각에 클래스 멤버가 래퍼 변수이면 개발자 친화적 인 동작 인 기본값에 의존하지 않습니다.
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 필드를 초기화하지 않고 사용하려고 할 때마다 무의식적으로 SSN으로 기본값 (0)을 데이터베이스에 삽입하는 것보다 낫습니다.
필요한 경우에만 래퍼 유형을 사용합니다.
그것들을 사용함으로써 당신은 그들이 있다는 사실 외에 많은 것을 얻지 못합니다 Objects
.
또한 메모리 사용량과 boxing / unboxing에 소요되는 시간의 오버 헤드를 잃게됩니다.
컬렉션은 단순한 Java 래퍼 개체의 일반적인 경우입니다. 그러나 코드 (값 개체)에서 래퍼에보다 구체적인 의미를 부여하는 것을 고려할 수 있습니다.
IMHO는 코드의 가독성과 유지 관리로 귀결 될 때 값 객체를 사용하는 데 거의 항상 이점이 있습니다. 특정 책임이있는 객체 내부에 간단한 데이터 구조를 래핑하면 코드가 단순화되는 경우가 많습니다. 이것은 Domain-Driven Design 에서 매우 중요한 것입니다 .
물론 성능 문제가 있지만 적절한 데이터로 성능을 측정하고 문제 영역에 대한보다 직접적인 조치를 취할 수있을 때까지이를 무시하는 경향이 있습니다. 코드도 이해하기 쉬운 경우 성능 문제를 이해하는 것이 더 쉬울 수도 있습니다.
실제로 나는 래퍼 클래스의 사용을 설명 할 수있는 상황에 직면했습니다.
long
유형 변수 가있는 서비스 클래스를 만들었습니다.
- 변수가 유형 인 경우
long
-초기화되지 않은 경우 0으로 설정됩니다. 이는 GUI에 표시 될 때 사용자에게 혼동을 줄 것입니다. - 변수 유형이
Long
초기화되지 않은 경우 다음 으로 설정됩니다null
.이 null 값은 GUI에 표시되지 않습니다.
이것은 기본 값을 Boolean
사용할 때 값이 더 혼동 될 수있는 경우 에도 적용됩니다 boolean
(기본값은 false이므로).
수치 계산이 지배하는 응용 프로그램의 성능 은 프리미티브를 사용하여 큰 이점을 얻을 수 있습니다.
기본 유형 은 == 연산자를 사용하지만 래퍼의 경우 선호되는 선택은 equals () 메서드를 호출하는 것입니다.
"Primitive types considered harmful" because they mix "procedural semantics into an otherwise uniform object-oriented model.
Many programmers initialize numbers to 0 (default) or -1 to signify this, but depending on the scenario, this may be incorrect or misleading.
If you want to use Collections, you must use Wrapper classes.
Primitive types, are used for arrays. Also, to represent data that has no behaviour,for example, a counter, or a boolean condition.
Since autoboxing, the "when to use primitive or wrapper" frontier has become quite fuzzy.
But remember, Wrappers are objects, so you get all the fancy Java features. For example, you can use reflexion to create Integer objects, but not int values. Wrapper classes also have methods such as valueOf.
If you want to create a value type. Something like a ProductSKU or AirportCode.
When a primitive type (string in my examples) defines equality, you'll want to override equality.
Primitive values in Java are not object. In order to manipulate these values as object the java.lang package provides a wrapper class for each of the primitive data type.
All Wrapper classes are final. The object of all wrapper classes that can be instantiated are immutable that means the value in the wrapper object can not be changed.
Although, the void class is considered a wrapper class but it does not wrap any primitive values and is not insatiable. It has not public constructor, it just denotes a class object representing the keyword void.
참고URL : https://stackoverflow.com/questions/1570416/when-to-use-wrapper-class-and-primitive-type
'IT story' 카테고리의 다른 글
벡터의 대안 (0) | 2020.09.14 |
---|---|
git-flow를 따라 이전 릴리스의 핫픽스를 어떻게 처리해야합니까? (0) | 2020.09.14 |
GitHub 코드 검색에서 문자를 어떻게 이스케이프합니까? (0) | 2020.09.14 |
등가 정적 및 비 정적 방법의 속도 차이가 큼 (0) | 2020.09.14 |
Array.Length가 단위가 아닌 정수인 이유 (0) | 2020.09.14 |