Existe um tipo de referência Java Void
- V maiúsculo . A única situação que eu já vi usada é parametrizar s Callable
final Callable<Void> callable = new Callable<Void>() {
public Void call() {
foobar();
return null;
}
};
Existem outros usos para o Void
tipo de referência Java ? Pode ser atribuído algo além de null
? Se sim, você tem exemplos?
Respostas:
Void
tornou-se uma convenção para um argumento genérico no qual você não está interessado. Não há motivo para usar qualquer outro tipo não instável, comoSystem
.Também é frequentemente usado em por exemplo
Map
valores (embora osCollections.newSetFromMap
usosBoolean
como mapas não precisem aceitarnull
valores) ejava.security.PrivilegedAction
.Eu escrevi um post do blog em
Void
alguns anos atrás.fonte
java.lang.Void
. / Josh Bloch popularizou a convenção, embora uma vez que você a tenha visto, seja a escolha óbvia.Você pode criar uma instância do Void usando reflexos, mas eles não são úteis para nada. Vazio é uma maneira de indicar que um método genérico não retorna nada.
imprime algo como
fonte
System.exit(0)
). Eu costumo escrever classes de utilidade com um construtor comoprivate Void() { throw new Error(); }
. Alguns podem preferir uma enumeração sem valor.Future<Void>
funciona como charme. :)fonte
Future<?>
, pois o futuro geralmente terá um valor legítimo (não-Void
tipo), mas é usado em um contexto que não se importa com o valor.CompletableFuture<Void>
funciona como um encanto também.Dado que não há construtores públicos , eu diria que não pode ser atribuído nada além de
null
. Eu apenas o usei como espaço reservado para "Não preciso usar esse parâmetro genérico", como mostra seu exemplo.Também poderia ser usado na reflexão, pelo que diz o Javadoc :
fonte
Todos os classe empacotadora (
Integer
,Byte
,Boolean
,Double
, etc.) conter uma referência para a classe correspondente primitiva em um estáticoTYPE
campo, por exemplo:Void
foi criado inicialmente como um local para colocar uma referência aovoid
tipo:No entanto, você realmente não ganha nada usando
Void.TYPE
. Quando você usavoid.class
, é muito mais claro que você está fazendo algo com ovoid
tipo.Como um aparte, a última vez que tentei, o BeanShell não reconheceu
void.class
, então você precisa usáVoid.TYPE
-lo.fonte
Quando você usa o padrão de visitante , pode ser mais limpo usar Void, em vez de Object, quando quiser ter certeza de que o valor de retorno será nulo.
Exemplo
Quando você implementa seu visitante, pode explicitamente definir OUT como nulo, para que saiba que seu visitante sempre retornará nulo, em vez de usar Objeto
fonte
Antes dos genéricos, ele era criado para a API de reflexão, para manter TYPE retornado por Method.getReturnType () para um método nulo, correspondente às outras classes de tipos primitivos.
EDIT: No JavaDoc do Void: "A classe Void é uma classe de espaço reservado instável para manter uma referência ao objeto Class que representa a palavra-chave Java void". Antes da Genéricos, não tenho outra utilidade além da reflexão.
fonte
Void
. Veja stackoverflow.com/questions/34248693/…Como você não pode instanciar o Void, você pode usar o objeto nulo do Apache commons , então
na primeira linha, você tem um objeto, então
aNullObject != null
mantém, enquanto na segunda linha não há referência, entãonoObjectHere == null
mantémPara responder à pergunta original do pôster, o uso para isso é diferenciar entre "o nada" e "nada", que são coisas completamente diferentes.
PS: Diga não ao padrão de objeto nulo
fonte
Vazio é criar para quebrar seu tipo de vazio primitivo. Todo tipo primitivo tem seu tipo de referência correspondente. O void é usado para instanciar uma classe genérica ou o uso de um método genérico. Argumentos genéricos nos quais você não está interessado. E aqui está um exemplo ...
aqui, como você pode ver, não quero nada do servidor que estou pedindo para criar um novo registro, mas
public interface AsyncCallback<T> { .... }
é uma interface genérica, então forneço o Void, pois os genéricos não aceitam tipos primitivosfonte
Também é comumente usado em retornos de chamada de conclusão de Async-IO quando você não precisa de um
Attachment
objeto. Nesse caso, você especifique nulo para a operação IO e implementarCompletionHandler<Integer,Void>
.fonte
Pode ser um caso raro, mas uma vez eu usei
Void
nas classes de aspecto.Esse era um aspecto que é executado após os métodos que possuem uma
@Log
anotação e registra o método retornado e algumas informações se o tipo de retorno do método não for nulo.fonte