Java Void Reference Type에 사용합니까?


163

자바가 VoidV-- 대문자 - 참조 형은 . 내가 본 유일한 상황은 Callables 를 매개 변수화하는 것입니다.

final Callable<Void> callable = new Callable<Void>() {
            public Void call() {
                foobar();
                return null;
            }
        };

Java Void참조 유형에 다른 용도가 있습니까? 그것 이외의 다른 것을 할당 할 수 있습니까 null? 그렇다면 예가 있습니까?



답변:


116

Void에 관심이없는 일반적인 주장에 대한 관례가되었습니다.와 같은 다른 불가 한 유형을 사용해야하는 이유는 없습니다 System.

또한 자주 예에 사용된다 Map(비록 값을 Collections.newSetFromMap사용 Boolean지도로 받아 들일 필요가 없습니다 null값)와 java.security.PrivilegedAction.

몇 년 전에 웹 로그 항목 을 썼습니다 Void.


누가 그 협약을 만들었습니까? docs state docs.oracle.com/javase/tutorial/java/generics/types.html "유형 매개 변수 명명 규칙 기본적으로 유형 매개 변수 이름은 대문자, 대문자입니다."
barlop

4
@barlop 매개 변수 이름이 아닌 인수입니다. 즉, 유형 java.lang.Void입니다. 조쉬 블로흐 (Josh Bloch)는 컨벤션을 대중화했지만 일단 본 후에는 분명한 선택입니다.
Tom Hawtin-tackline

2
그 블로그 항목은 죽었다
mFeinstein

51

리플렉션을 사용하여 Void 인스턴스를 만들 수는 있지만 아무 것도 유용하지 않습니다. 무효는 일반 메소드가 아무것도 리턴하지 않음을 표시하는 방법입니다.

Constructor<Void> constructor = Void.class.getDeclaredConstructor();
constructor.setAccessible(true);
Void v = constructor.newInstance();
System.out.println("I have a " + v);

다음과 같은 것을 인쇄합니다

I have a java.lang.Void@75636731

22
문서에서 말한 클래스를 인스턴스화 할 수없는 경우 +1입니다. 나도 이것을했고 나는 인스턴스화 된 공허가 쓸모가 없다는 것에 동의합니다.
Luke Woodward

1
생성자 <Void> cv = Void.class.getDeclaredConstructor (); cv.setAccessible (true); 무효 v = cv.newInstance (); System.out.println (v); //;)
Peter Lawrey

연습으로, 리플렉션을 사용하여 새로운 클래스를 만들어보고 무슨 일이 일어나는지보십시오.
피터 로리

sun.reflect.InstantiationExceptionConstructorAccessorImpl에서 java.lang.InstantiationException이 발생했습니다. :(
Luke Woodward

7
이것은 구현에 따라 다르며 언제든지 변경 될 수 있습니다. 클래스에 인수가없는 생성자가 있다고 보장 할 수 없으며, 아무 것도 할 수있는 생성자가 있더라도 (아마도 System.exit(0)). 나는 생성자를 사용하여 유틸리티 클래스를 작성하는 경향이 private Void() { throw new Error(); }있습니다. 일부는 값이없는 열거 형을 선호 할 수 있습니다.
Tom Hawtin-tackline


19

공개 생성자없기 때문에 이외의 다른 것을 할당 할 수 없다고 말할 수 있습니다 null. 예제에서 보듯이 "이 일반 매개 변수를 사용할 필요가 없습니다"라는 자리 표시 자로 만 사용했습니다.

Javadoc이 말한 내용을 반영하여 사용할 수도 있습니다 .

Void 클래스는 Java 키워드 void를 나타내는 Class 객체에 대한 참조를 보유 할 수없는 자리 표시 자 클래스입니다.


Oracle / Sun이 널 (null)이 모든 유형의 인스턴스라고 설명하는 것을 볼 수있을 정도로 재미 있습니다. 어쨌든, 당신이 말했듯이, 그것의 순수한 의미는 "나는 여기에 관심이없는 어떤 타입이든 쓸 수있다. 그래서 나는 내 코드를 읽는 사람들이 그것을 정확하게 이해하도록 Void를 넣을 것이다"
Snicolas

17

모든 프리미티브 래퍼 클래스 ( Integer, Byte, Boolean, Double, 등)의 고정에 대응하는 기본 클래스에 대한 참조 포함 TYPE예컨대 필드 :

Integer.TYPE == int.class
Byte.TYPE == byte.class
Boolean.TYPE == boolean.class
Double.TYPE == double.class

Voidvoid유형 에 대한 참조를 넣기 위해 처음에 어딘가로 작성되었습니다 .

Void.TYPE == void.class

그러나을 사용하여 실제로 얻는 것은 없습니다 Void.TYPE. 사용 void.class하면 void유형으로 무언가를하고 있다는 것이 훨씬 명확합니다 .

따로, 마지막으로 시도했을 때 BeanShell 은 인식하지 못했기 void.class때문에 Void.TYPE거기 에서 사용해야 합니다.


8
따라서 Void.class와 void.class가 모두 있습니다!
Tom Anderson

8

당신이 사용하는 경우 방문자 패턴을 당신이 반드시 반환 값이 null이 될 것으로 할 때 청소기 대신 객체의 무효 사용할 수 있습니다

public interface LeavesVisitor<OUT>
{
   OUT visit(Leaf1 leaf);

   OUT visit(Leaf2 leaf);
}

방문자를 구현할 때 방문자를 명시 적으로 무효로 설정하여 방문자가 Object를 사용하는 대신 항상 null을 반환한다는 것을 알 수 있습니다.

public class MyVoidVisitor implements LeavesVisitor<Void>
{
    Void visit(Leaf1 leaf){
        //...do what you want on your leaf
        return null;
    }

    Void visit(Leaf2 leaf){
        //...do what you want on your leaf
        return null;
    }
}

5

제네릭 이전에는 리플렉션 API에 대해 생성되어 다른 기본 유형 클래스에 해당하는 void 메소드에 대해 Method.getReturnType ()에 의해 리턴 된 TYPE을 보유합니다.

편집 : Void의 JavaDoc에서 : "Void 클래스는 Java 키워드 void를 나타내는 Class 객체에 대한 참조를 보유 할 수없는 자리 표시 자 클래스입니다." 제네릭 이전에는 리플렉션 이외의 용도는 없습니다.


나는 이것을 믿지 않습니다. 현재 1.4 또는 그 이전의 JVM이 없지만 Method.getReturnType ()은 항상 void 메소드에 대해 void.class를 반환했다고 생각합니다.
Luke Woodward

@Pour : 제네릭 이전에 , 내가 알고있는 유일한 용도는 void의 Method.getReturnType ()에서 void 메소드에 사용 된 TYPE (Void.TYPE에서와 같이)을 보유하는 것입니다.
Lawrence Dol

어떻게 든 돌아 오지 않습니다 Void. stackoverflow.com/questions/34248693/…
Alireza Fattahi

3

Void를 인스턴스화 할 수 없으므로 Apache commons Null object를 사용할 수 있으므로

Null aNullObject = ObjectUtils.Null;
Null noObjectHere = null;

첫 번째 줄에는 객체가 있으므로 aNullObject != null유지하고 두 번째 줄에는 참조가 없으므로 noObjectHere == null유지합니다

포스터의 원래 질문에 답하기 위해, 이것의 사용법은 완전히 다른 것들 인 "아무것도"와 "아무것도"를 구별하는 것입니다.

추신 : Null 개체 패턴을 말하십시오


1

Void는 기본 void 유형을 래핑하기 위해 만들어집니다. 모든 기본 유형에는 해당하는 참조 유형이 있습니다. Void는 제네릭 클래스를 인스턴스화하거나 제네릭 메서드를 사용하는 데 사용됩니다. 관심없는 제네릭 인수 마녀는 여기에 예제입니다 ...

public void onNewRegistration() {
    newRegistrationService.createNewUser(view.getUsername(), view.getPassword(),
            view.getInitialAmount(), view.getCurrency(), new AsyncCallback<Void>() {
      @Override
      public void onFailure(Throwable caught) {

      }

      @Override
      public void onSuccess(Void result) {
        eventBus.fireEvent(new NewRegistrationSuccessEvent());
      }
    });
  } 

여기에서 볼 수 있듯이 새 등록을 요청하는 서버에서 아무것도 원하지 않지만 public interface AsyncCallback<T> { .... }일반 인터페이스이므로 제네릭이 기본 유형을 허용하지 않으므로 Void를 제공합니다.


0

또한 Attachment객체 가 필요없는 Async-IO 완료 콜백에서 일반적으로 사용됩니다 . 이 경우 IO 작업에 null을 지정하고 구현 CompletionHandler<Integer,Void>합니다.


0

드문 경우이지만 한 번은 Void 측면 클래스에서 되었습니다.

이것은 @Log어노테이션 이있는 메소드 다음에 실행되는 측면으로 , 메소드 리턴 유형이 void가 아닌 경우 리턴 된 메소드 및 일부 정보를 로깅합니다.

 @AfterReturning(value = "@annotation(log)", 
       returning = "returnValue", 
       argNames = "joinPoint, log, returnValue"
      )
    public void afterReturning(final JoinPoint joinPoint, final Log log,
            final Object returnValue) {

            Class<?> returnType = ((MethodSignature) joinPoint.getSignature())
            .getReturnType();
           if (Void.class.isAssignableFrom (returnType)) ) {
            //Do some log
         }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.