O que eu retorno se o tipo de retorno de um método for Void? (Não vazio!)

115

Devido ao uso de Genéricos em Java acabei tendo que implementar uma função tendo Voidcomo tipo de retorno:

public Void doSomething() {
    //...
}

e o compilador exige que eu retorne algo . Por enquanto, estou voltando null, mas gostaria de saber se isso é uma boa prática de codificação ...

Estou perguntando sobre V ‌oid, não v ‌oid. A classe Void, não a palavra-chave reservada void.

Eu também tentei Void.class, void, Void.TYPE, new Void(), nenhum retorno em tudo, mas tudo o que não funciona em todos. (Por razões mais ou menos óbvias) (Veja esta resposta para detalhes)

  • Então, o que devo retornar se o tipo de retorno de uma função for Void?
  • Qual é o uso geral da Voidclasse?
Daniel Rikowski
fonte

Respostas:

104

Então, o que devo retornar se o tipo de retorno de uma função tiver que ser Void?

Use return null. Voidnão pode ser instanciado e é apenas um espaço reservado para o Class<T>tipo de void.

Qual é o ponto de Void?

Conforme observado acima, é um espaço reservado. Voidé o que você receberá de volta se, por exemplo, usar reflexão para examinar um método com um tipo de retorno de void. (Tecnicamente, você voltará Class<Void>.) Ele tem outros usos diversos ao longo dessas linhas, como se você quiser parametrizar a Callable<T>.

Devido ao uso de genéricos em Java acabei tendo que implementar esta função

Eu diria que algo pode estar estranho com sua API se você precisar implementar um método com essa assinatura. Considere cuidadosamente se há uma maneira melhor de fazer o que você deseja (talvez você possa fornecer mais detalhes em uma pergunta de acompanhamento diferente?). Estou um pouco desconfiado, pois isso só surgiu "por causa do uso de genéricos".

John Feminella
fonte
13
Ter que retornar o Vazio não é tão funky, afinal. Ele pode simplesmente ser exigido por exemplo, Callable <T>. Às vezes, você simplesmente não precisa retornar algo, mas não pode usar, por exemplo, Runnable.
Bombe
O Void tem usos legítimos, como observei. Mas disse que “isso só surgiu devido ao uso de genéricos”. Isso faz parecer que ele fez algo com uma coleção que precisa usar o Void, o que eu diria que é um caso excepcional.
John Feminella
Com as coleções seria muito estranho, de fato.
Bombe
Ambos Void.class e void.class são Class <Void>, mas não são iguais. Void é frequentemente usado como um argumento genérico no valor de Map (ou use Collections.newSetFromMap) e retorno de AccessController.doPrivileged.
Tom Hawtin - tackline
@Tom: Yeppers. É por isso que marquei "(Tecnicamente, você receberá de volta a Classe <Void>.)" Devo corrigir essa parte ou você acha que está correta como está?
John Feminella
26

Não há como instanciar um Void, então a única coisa que você pode retornar é null.

Jon Bright
fonte
13
Mais precisamente, não há como instanciar um Vazio sem fazer coisas más.
Michael Myers
20

return null é o caminho a percorrer.

Bombe
fonte
20

Para deixar claro por que as outras sugestões que você deu não funcionam:

Void.classe Void.TYPEapontam para o mesmo objeto e são do tipo Class<Void>, não do Void.

É por isso que você não pode retornar esses valores. new Void()seria do tipo, Voidmas esse construtor não existe. Na verdade, Voidnão tem construtores públicos e, portanto, não pode ser instanciado: você nunca pode ter qualquer objeto do tipo, Voidexceto para o polimórfico null.

Espero que isto ajude! :-)

Martijn
fonte
1
Correção menor: Void.TYPEnão aponta para Void.class. Ele aponta para void.class.
shmosel
1

Se, por razões obscuras, você DEVE usar este tipo, então retornar null parece ser uma opção sensata, uma vez que suponho que o valor de retorno não será usado de qualquer maneira.
O compilador irá forçá-lo a retornar algo de qualquer maneira.
E esta classe não parece ter um construtor público, então new Void () não é possível.

PhiLho
fonte
Eu não serei uma OBRIGAÇÃO; é apenas convenção.
Tom Hawtin - tackline
-2

bem assim.

public Class TestClass {
    public void testMethod () {
        return;
    }
}
Jang-Ho Bae
fonte
2
O OP disse Void, não void. As outras respostas já parecem cobrir bastante bem o assunto.
E_net4 fica longe de Meta