题
有一个Java Void
--大写字母V-- 基准类型.唯一的情况我已经见过它使用的是来参数化 Callable
s
final Callable<Void> callable = new Callable<Void>() {
public Void call() {
foobar();
return null;
}
};
是否有任何其他用途的Java Void
参照类型?它可以永远不会分配的任何东西比 null
?如果是的话,你有没有实例?
解决方案
Void
已成为《公约》的一般性论点,你不感兴趣。没有原因为什么应当使用任何其他非instantiable类型,例如 System
.
它也常常使用例如 Map
值(虽 Collections.newSetFromMap
使用 Boolean
作为地图没有接受 null
值)和 java.security.PrivilegedAction
.
我写了一个 博客入口 上 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
.我只有用它作为一个占位"我不需要使用这个通用的参数,"作为例所示。
它还可用于反思,从它的什么 如果是的话,为什么不试 说:
空类是一个uninstantiable符类保持一个参考课对象,表示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
那里。
当你使用 访问的模式 它可以更清洁的使用无效,而不是象当你想要的,以确保返回的价值将空
例
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,以保持型返回的方法。getReturnType()为有效的方法,对应于其他原始种类型的课程。
编辑:从如果是的话,为什么不试的无效:"空隙类是一个uninstantiable符类保持一个参考课对象,表示Java关键词无效的"。前仿制药,我知道没有使用比其他的反射。
因为你不能化的空隙,可以使用 Apache识共享空对象, ,所以
Null aNullObject = ObjectUtils.Null;
Null noObjectHere = null;
在第一线,你有一个目的,所以 aNullObject != null
拥有,而在二线没有参考,所以 noObjectHere == null
持有
回答海报的最初的问题,使用的是区分"没什么"和"没什么",这是完全不同的事情。
PS:说没有空对象的图案
无效是创建包裹它的原始无效的类型。每一个基本类型都有相应的基准类型。无效用的实例一般类或者使用一种通用方法,一般性辩论的巫婆,你是不感兴趣。这里是一个例子...
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> { .... }
是一个通用的接口,所以我提供无效,因为泛型不接受基本类型
这也是常用异步IO完成回时,你没有需要一个 Attachment
对象。在这种情况下,指定空IO操作和实施 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
}
}