用于Java Void引用types?
有一个Java Void
– 大写的V– 参考types 。 我见过的唯一的情况是参数化Callable
final Callable<Void> callable = new Callable<Void>() { public Void call() { foobar(); return null; } };
Java Void
引用types还有其他用途吗? 它可以分配任何非null
? 如果是的话,你有例子吗?
Void
已经成为您不感兴趣的一般性论证的惯例。没有理由为什么您应该使用任何其他不可实例化的types,比如System
。
它也经常用于例如Map
值(尽pipeCollections.newSetFromMap
使用Boolean
因为地图不必接受null
值)和java.security.PrivilegedAction
。
几年前,我在Void
上写了一个博客条目 。
你可以使用reflection来创buildVoid的实例,但是它们对于任何东西都是没有用的。 无效是一种方法来表明一个通用的方法没有返回任何东西。
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关键字void的Class对象的引用。
所有原始包装类( Integer
, Byte
, Boolean
, Double
等)都包含对静态TYPE
字段中相应基本类的引用,例如:
Integer.TYPE == int.class Byte.TYPE == byte.class Boolean.TYPE == boolean.class Double.TYPE == double.class
Void
最初被创build为某个地方来提及void
types:
Void.TYPE == void.class
但是,通过使用Void.TYPE
,你并没有真正获得任何东西。 当你使用void.class
的时候,你会用void
types来做更清晰的事情。
void.class
一下,最后一次尝试它, BeanShell不承认void.class
,所以你必须在那里使用Void.TYPE
。
在使用访问者模式时,如果要确保返回值为空,则可以使用Void而不是Object。
例
public interface LeavesVisitor<OUT> { OUT visit(Leaf1 leaf); OUT visit(Leaf2 leaf); }
当你实现你的访问者时,你可以明确地将OUT设置为Void,这样你就知道你的访问者将总是返回null,而不是使用Object
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; } }
在generics之前,它是为reflectionAPI创build的,为void方法返回由Method.getReturnType()返回的TYPE,对应于其他基本types类。
编辑:从Void的JavaDoc:“Void类是一个不合理的占位符类来持有代表Java关键字无效的类对象的引用”。 在generics之前,我知道没有其他用途,除了反思。
void创build包装其原始的voidtypes。 每个原始types都有相应的引用types。 void用于实例化一个generics类或使用generics方法,一个你不感兴趣的generics参数,这里是一个例子…
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()); } }); }
在这里,你可以看到,我不想从服务器的任何东西,我要求创build一个新的注册,但public interface AsyncCallback<T> { .... }
是一个通用的接口,所以我提供无效,因为generics没有不接受原始types
由于你不能实例化Void,所以你可以使用Apache commons Null对象
Null aNullObject = ObjectUtils.Null; Null noObjectHere = null;
在第一行中,你有一个对象,所以aNullObject != null
成立,而在第二行没有引用,所以noObjectHere == null
成立
要回答海报的原始问题,用法是区分“无”和“无”,这是完全不同的东西。
PS:对空对象模式说“不”
当您不需要Attachment
对象时,它也常用于Async-IO完成callback。 在这种情况下,您可以为IO操作指定null并实现CompletionHandler<Integer,Void>
。
这可能是罕见的情况,但是有一次,我在方面类中使用了Void
。
这是在具有@Log
注释的方法之后运行的一个方面,如果方法返回types不是void,则logging返回的方法和一些信息。
@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 } }