문제
자바가 있습니다 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
}
}