Nice programing

java.lang.Void와 void의 차이점은 무엇입니까?

nicepro 2020. 12. 31. 23:26
반응형

java.lang.Void와 void의 차이점은 무엇입니까?


API에서

"Void 클래스는 Java 키워드 void를 나타내는 Class 객체에 대한 참조를 보유하는 인스턴스화 할 수없는 플레이스 홀더 클래스입니다."

  1. "Ininstantiable"자리 표시 자 클래스 란 무엇입니까? 언제 java.lang.Void사용됩니까? 클래스가 "ininstantiable"이면 어떤 용도로 사용됩니까?
  2. java.lang.Void과의 차이점은 무엇입니까 void?

만 점 의는 Void보류하는 것입니다 Void.TYPE종류 등이다 void.class. 를 반환하는 메서드에 대한 반사 참조가 있고 void반환 유형을 가져 오면 Void.TYPE.

다른 용도로 사용할 수 없으며 사용해서는 안됩니다.


java.lang.Void과 유사합니다 java.lang.Integer. Integer기본 유형의 값을 박싱하는 방법입니다 int. Void기본 유형의 값을 박싱하는 방법입니다 void.

"하지만 잠깐, void가능한 값이 없습니다!"

권리! 그것이 java.lang.Void"불필요한"것입니다. :)

모든 프리미티브 유형이 박스형에 해당하는 Java 유형 시스템의 멋진 기능입니다. inthas Integer, longhas Long, bytehas Byte... 및 voidhas Void. 존재 Void 하지 않는다면 이상하고 비대칭적일 것 입니다.

"그래서 차이 무엇 java.lang.Voidvoid?"

쉬운. void기본 유형입니다. Void에서 상속되는 참조 유형입니다 Object. 둘 다 가능한 값이 없다는 점에서 비슷합니다. 그럼에도 불구하고 유형 시스템의 관점에서 보면 두 가지 매우 다른 유형입니다.

"하지만 나는 Void내 프로그램에서 아무 소용이 없다 ."

그리고 나는 GarbageCollectorMXBean용도가 없습니다 . 일부 기능은하지 않습니다 아닌 모호한 사용합니다. 괜찮아요.


의 가장 일반적인 용도 Void는 반 사용 이지만 이것이 사용될 수있는 유일한 장소는 아닙니다.

void 함수가 값을 생성하지 않음을 의미하는 키워드입니다.

java.lang.Void 참조 유형이면 다음이 유효합니다.

 Void nil = null;

(지금까지는 흥미롭지 않습니다 ...)

결과 유형 (반환 값이 type 인 Void함수)은 * 항상 * 함수가 반환 함을 의미합니다 null( 인스턴스가 없기 null때문에 Void제외한 다른 것을 반환 할 수 없음 ).

 Void function(int a, int b) {
    //do something
    return null;
 }

항상 null을 반환 하는 함수를 원하는 이유는 무엇 입니까?

제네릭이 발명되기 전에는 Void.

제네릭에는 몇 가지 흥미로운 사례가 있습니다. 예를 들어, a Future<T>는 다른 스레드에서 수행 한 비동기 작업의 결과에 대한 홀더입니다. Future.get연산 값 (유형 T) 을 반환하고 계산이 수행 될 때까지 차단됩니다.

하지만 ... 돌아갈 것이 없다면? 단순함 : Future<Void>. 예를 들어 Google App Engine에서 비동기 데이터 저장소 서비스 delete작업 은 삭제가 완료된 향후 . Whenget () is invoked on that future,null을 반환 합니다. Callable s 로 비슷한 예제를 작성할 수 있습니다.

또 다른 사용 사례는 Map없는 것 Map<T,Void>입니다. 이러한지도는처럼 동작하며 Set<T>,에 상응하는 구현이 없을 때 유용 할 수 있습니다 Set(예 :가없는 WeakHashSet경우 a를 사용할 수 있음 WeakHashMap<T,Void>).


Void는 void의 AutoBoxing 기능 (JDK 1.5 이후)입니다.

Void는 참조이고 void는 원시 유형이라는 자체 설명입니다.

따라서 요구 사항이 Void를 사용해야하는 곳 ???

기본 유형을 사용할 수없는 Generic 유형의 일반적인 사용법 중 하나입니다.

Android의 AsyncTaks<Params, Progress, Result>경우 진행률 업데이트를 받고 싶지 않으면 어떻게합니까? 여기서는 void (기본 유형)를 사용할 수 없습니다. java.lang.Void가 필요합니다.


사용 Void대한 또 다른 예 SwingWorker

new SwingWorker<Void, Integer> () {
    @Override
    protected Void doInBackground(){
        ...
    }
    @Override
    protected void process(List<Integer> chunk){
        ...
    }
    @Override
    public void done(){
        ...
    }
}.execute();

Void는 때때로 메서드 자체 외부에서 메서드의 반환 유형을 지정해야하기 때문에 유용합니다.

예를 들어라는 메서드를 사용하여 EventResource 객체에 특정 속성이 있는지 확인하는 다음 Java 8 람다 표현식을 사용하여 메서드 checkBenefitConcertInCentralPark에 전달합니다 checkCreatedEvent.

eventChecker.checkCreatedEvent(TestEvents::checkBenefitConcertInCentralPark);

checkBenefitConcertInCentralPark방법은 (공허의 사용에주의)과 같이 정의된다 :

    public static Void checkBenefitConcertInCentralPark(EventResource eventResource) { 
        // JUnit code here...
        // assertThat(blablabla  :)  )

        return null; // we can only return null at the end of a method when returning Void
    }

그런 다음 checkBenefitConcertInCentralPark메서드가 메서드에 전달됩니다 checkCreatedEvent.

    // Function<EventResource, Void> describes the checkBenefitConcertInCentralPark method
    public void checkCreatedEvent(Function<EventResource, Void> function) { 
        function.apply(this.eventResource);
    }

ReferenceURL : https://stackoverflow.com/questions/10839042/what-is-the-difference-between-java-lang-void-and-void

반응형