Autoboxing : 그래서 나는 쓸 수 있습니다 : 정수 i = 0; 대신 : 정수 i = 새로운 정수 (0);

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

  •  12-09-2019
  •  | 
  •  

문제

오토 옥싱은 내가 쓸 수 있다는 사실로 내려진 것 같습니다.

Integer i = 0; 

대신에:

Integer i = new Integer(0);

따라서 컴파일러는 원시를 객체로 자동 변환 할 수 있습니다.

그게 아이디어인가요? 이것이 중요한 이유는 무엇입니까?

도움이 되었습니까?

해결책

당신은 그것을 너무 단순화했습니다.

컬렉션을 사용할 때는자가 옥싱도 작동합니다. Sun의 Java Docs에 설명 된 바와 같이 :

컬렉션은 객체 참조 만 보유 할 수 있으므로 원시 값을 적절한 래퍼 클래스에 상자에 박스해야합니다. ... 컬렉션에서 객체를 꺼내면 입는 정수를 얻습니다. int가 필요한 경우 intvalue 메소드를 사용하여 정수를 Unbox를 무너 뜨려야합니다. 이 권투와 무 복원은 모두 고통스럽고 코드를 클러킹합니다. 오토 옥싱 및 Unboxing 기능은 프로세스를 자동화하여 통증과 혼란을 제거합니다.

그렇다면 언제 오토 옥싱 및 Unboxing을 사용해야합니까? 예를 들어 숫자 값을 컬렉션에 넣어야 할 때와 같이 참조 유형과 프리미티브 사이에 "임피던스 불일치"가있을 때만 사용하십시오. 과학 컴퓨팅 또는 기타 성능에 민감한 수치 코드에 자서전 및 Unboxing을 사용하는 것은 적절하지 않습니다. 정수는 int를 대체하지 않습니다. 오토 옥싱 및 Unboxing은 원시 유형과 기준 유형의 구별을 흐리게하지만 제거하지는 않습니다.

자서전에 대한 훌륭한 개요

다른 팁

BTW

Integer i = 0;

동일합니다

Integer i = Integer.valueOf(0);

value의 value는 -128에서 127 사이의 값에 대한 새로운 객체를 생성하지 않는다는 것입니다 (Java 6U14 인 경우 이것은 분명히 조정할 수 있습니다).

코드를 작성할 수 있도록 존재합니다

List<Integer> is = new ArrayList<Integer>();
is.add(1); // auto-boxing
is.add(2);
is.add(3);

int sum = 0;
for (int i : is)  // auto-unboxing
{
    sum += i;
}

단일 정수의 경우 기본적으로 정수가 아닌 유형 int를 사용해야합니다. 정수는 대부분 컬렉션에 사용하기위한 것입니다.

길이는 정수와 같은 값과 다르지만 (equals () 사용)와 다르지만 int (auding ==)와 동일합니다.

그것이 아이디어입니다. 그러나 정수를 INT에 할당 할 수있는 것이 훨씬 편리합니다.

오토 옥싱은 원인이 아닌 증상을 다루고 있다고 주장 할 수 있습니다. 실제 혼란의 원인은 Java의 유형 시스템이 일관성이 없다는 것입니다. 프리미티브와 객체 참조의 필요성은 인공적이고 어색합니다. 오토 옥스는 그 정도를 완화시킵니다.

냉소적 인 모자를 켜고 : 원래 Java (여기서 오크를 의미하는) 사양에 대한 제한 사항에 대한 메이크업. 처음만이 아닙니다.

더 읽기 쉽고 깔끔한 코드를 만듭니다. 특히 작업을 수행하는 경우 (Java에는 작업자 과부하가 없기 때문에).

Joshua Bloch의 효과적인 Java를 읽은 것에서 내가 기억하는 것에서, 당신은 박스형 상대방의 프리미티브를 고려해야합니다. 부작용에 관계없이자가 옥싱은 문제를 일으킬 수 있습니다.

Lim의 의견을 더하면 프리미티브는 스택에 저장되며 객체로서 원시 랩퍼는 힙에 저장됩니다. 이로 인해 미묘한 영향이 있습니다.

주요 장점은 기본적으로 가독성, 구문 설탕입니다. Java는 이미 매우 장악이며 Sun은 구문을 더 짧게 만들기 위해 모든 종류의 방법을 시도하고 있습니다.

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