Es gibt einen Java Void
- V - Referenztyp in Großbuchstaben . Die einzige Situation, die ich jemals gesehen habe, ist die Parametrisierung von Callable
s
final Callable<Void> callable = new Callable<Void>() {
public Void call() {
foobar();
return null;
}
};
Gibt es andere Verwendungszwecke für den Java- Void
Referenztyp? Kann es jemals etwas anderes zugewiesen werden als null
? Wenn ja, haben Sie Beispiele?
Antworten:
Void
ist zur Konvention für ein generisches Argument geworden, an dem Sie nicht interessiert sind. Es gibt keinen Grund, warum Sie einen anderen nicht instanziierbaren Typ verwenden sollten, wie zSystem
.Es wird auch häufig in beispielsweise
Map
Werten verwendet (obwohlCollections.newSetFromMap
VerwendungenBoolean
als Karten keinenull
Werte akzeptieren müssen ) undjava.security.PrivilegedAction
.Ich habe vor ein paar Jahren einen Weblog-Eintrag geschrieben
Void
.quelle
java.lang.Void
. / Josh Bloch hat die Konvention populär gemacht, obwohl es die offensichtliche Wahl ist, wenn Sie sie einmal gesehen haben.Sie können eine Instanz von Void mithilfe von Reflexionen erstellen, diese sind jedoch für nichts nützlich. Void ist eine Möglichkeit, anzugeben, dass eine generische Methode nichts zurückgibt.
druckt so etwas wie
quelle
System.exit(0)
) alles kann . Ich neige dazu, Utility-Klassen mit einem Konstruktor als zu schreibenprivate Void() { throw new Error(); }
. Einige bevorzugen möglicherweise eine Aufzählung ohne Wert.Future<Void>
wirkt wie Charme. :) :)quelle
Future<?>
, da die Zukunft oft einen legitimen Wert (vom Nicht-Void
Typ) hat, aber in einem Kontext verwendet wird, der sich nicht um den Wert kümmert.CompletableFuture<Void>
funktioniert auch wie ein Zauber.Da es keine öffentlichen Konstruktoren gibt , würde ich sagen, dass nichts anderes zugewiesen werden kann als
null
. Ich habe es nur als Platzhalter für "Ich muss diesen generischen Parameter nicht verwenden" verwendet, wie Ihr Beispiel zeigt.Es könnte auch in der Reflexion verwendet werden, wie sein Javadoc sagt:
quelle
Alle die primitiven Wrapper - Klassen (
Integer
,Byte
,Boolean
,Double
usw.) enthalten einen Verweis auf die entsprechenden primitive Klasse in einem statischenTYPE
Feld, zum Beispiel:Void
wurde ursprünglich als irgendwo erstellt, um einen Verweis auf denvoid
Typ zu setzen:Sie gewinnen jedoch nicht wirklich etwas mit
Void.TYPE
. Wenn Sie verwenden, istvoid.class
es viel klarer, dass Sie etwas mit demvoid
Typ tun .Abgesehen davon hat BeanShell das letzte Mal, als ich es ausprobiert habe, nicht erkannt
void.class
, sodass Sie esVoid.TYPE
dort verwenden müssen.quelle
Wenn Sie das Besuchermuster verwenden, kann es sauberer sein, Void anstelle von Object zu verwenden, wenn Sie sicherstellen möchten, dass der Rückgabewert null ist
Beispiel
Wenn Sie Ihren Besucher implementieren, können Sie OUT explizit als ungültig festlegen, damit Sie wissen, dass Ihr Besucher immer null zurückgibt, anstatt Object zu verwenden
quelle
Vor Generics wurde es für die Reflection-API erstellt, um den von Method.getReturnType () zurückgegebenen TYPE für eine void-Methode zu speichern, die den anderen primitiven Typklassen entspricht.
BEARBEITEN: Aus dem JavaDoc von Void: "Die Void-Klasse ist eine nicht instabilisierbare Platzhalterklasse, die einen Verweis auf das Class-Objekt enthält, das das Java-Schlüsselwort void darstellt." Vor Generics ist mir keine andere Verwendung als Reflexion bekannt.
quelle
Void
. Bitte sehen Sie stackoverflow.com/questions/34248693/…Wie Sie nicht instantiate Void können, können Sie Apache commons Null - Objekt , so
in der ersten Zeile, Sie ein Objekt haben, so
aNullObject != null
hält, während in der zweiten Zeile kein Hinweis gibt, sonoObjectHere == null
haltenUm die ursprüngliche Frage des Posters zu beantworten, besteht die Verwendung darin, zwischen "dem Nichts" und "nichts" zu unterscheiden, die völlig verschiedene Dinge sind.
PS: Sag Nein zum Null-Objektmuster
quelle
Void wird erstellt, um seinen primitiven Void-Typ zu umschließen. Jeder primitive Typ hat seinen entsprechenden Referenztyp. Void wird verwendet, um eine generische Klasse oder die Verwendung einer generischen Methode zu instanziieren. Ein generisches Argument, an dem Sie nicht interessiert sind. Und hier ist ein Beispiel ...
Wie Sie sehen können, möchte ich hier nichts von dem Server, den ich zum Erstellen neuer Registrierungen auffordere, sondern
public interface AsyncCallback<T> { .... }
eine generische Schnittstelle, sodass ich Void bereitstelle, da Generika keine primitiven Typen akzeptierenquelle
Es wird auch häufig bei Async-IO-Abschlussrückrufen verwendet, wenn Sie kein
Attachment
Objekt benötigen . In diesem Fall geben Sie für die E / A-Operation und die Implementierung null anCompletionHandler<Integer,Void>
.quelle
Es mag selten vorkommen, aber einmal habe ich
Void
in Aspektklassen verwendet.Dies war ein Aspekt, der nach Methoden mit
@Log
Anmerkungen ausgeführt wird und die zurückgegebene Methode und einige Informationen protokolliert, wenn der Rückgabetyp der Methode nicht ungültig ist.quelle