문제

자바가 있습니다 Void -대문자 v-- 참조 유형. 내가 사용한 유일한 상황은 매개 변수화입니다. Callable에스

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

Java에 대한 다른 용도가 있습니까? Void 참조 유형? 다른 것 외에는 할당 될 수 있습니다 null? 그렇다면 예제가 있습니까?

도움이 되었습니까?

해결책

Void 관심이 없다는 일반적인 주장에 대한 협약이되었습니다. System.

예를 들어 종종 사용됩니다 Map 값 (비록 Collections.newSetFromMap 용도 Boolean 지도가 수락 할 필요가 없으므로 null 값) 및 java.security.PrivilegedAction.

나는 a 웹 로그 항목 ~에 Void 몇 년 전.

다른 팁

반사를 사용하여 void 인스턴스를 만들 수는 있지만 아무것도 유용하지 않습니다. 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

Future<Void> 매력처럼 작동합니다. :)

있다는 점을 감안할 때 공개 생성자가 없습니다, 나는 그것이 다른 것 외에는 할당 될 수 없다고 말할 것입니다. null. 예제가 보여준 것처럼 "이 일반 매개 변수를 사용할 필요가 없습니다"의 자리 표시 자로 만 사용했습니다.

그것은 또한 반사에 사용될 수 있습니다. Javadoc 말 :

Void 클래스는 Java 키워드 공간을 나타내는 클래스 객체에 대한 참조를 보유하는 틀림없는 자리 표시 자 클래스입니다.

모든 원시 래퍼 클래스 (Integer, Byte, Boolean, Double, 등)은 정적에서 해당 원시 클래스에 대한 참조를 포함합니다. TYPE 필드, 예를 들어 :

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

Void 처음에는 void 유형:

Void.TYPE == void.class

그러나 사용하여 아무것도 얻지 못합니다 Void.TYPE. 당신이 사용할 때 void.class 당신이 무언가를하고 있다는 것이 훨씬 더 명확합니다. void 유형.

옆으로, 내가 마지막으로 시도했을 때 콩 껍질 인식하지 못했습니다 void.class, 당신은 사용해야합니다 Void.TYPE 거기.

당신이 사용할 때 방문자 패턴 리턴 값이 null인지 확인하고 싶을 때 객체 대신 void를 사용하는 것이 더 깨끗할 수 있습니다.

예시

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

   OUT visit(Leaf2 leaf);
}

방문자를 구현할 때는 객체를 사용하는 대신 방문자가 항상 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;
    }
}

제네릭 이전에는 반사 API를 위해 다른 원시 유형 클래스에 해당하는 무효 메소드에 대해 Method.getReturnType ()에 의해 반환 된 유형을 유지하도록 만들었습니다.

편집 : Void의 Javadoc에서 : "Void 클래스는 Java 키워드 void를 나타내는 클래스 객체에 대한 참조를 보유 할 수없는 자리 표시 자 클래스입니다." 제네릭 이전에는 반사 외에는 사용이 없다는 것을 알고 있습니다.

무효화를 인스턴스화 할 수 없으므로 사용할 수 있습니다 아파치 커먼즈 널 객체, 그래서

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

첫 번째 줄에는 객체가 있으므로 aNullObject != null 두 번째 줄에는 참조가 없지만 noObjectHere == null 보류

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

추신 : NULL 객체 패턴을 거절하십시오

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> { .... } 제네릭은 제네릭 인터페이스이므로 제네릭이 원시 유형을 허용하지 않기 때문에 공극을 제공합니다.

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

드문 경우 일 수도 있지만 한 번은 사용했습니다. Void 측면 클래스에서.

이것은 @Log 주석이 있고 메소드 리턴 유형이 무효 인 경우 메소드가 반환 된 메소드와 일부 정보를 기록합니다.

 @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
         }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top