Was gebe ich zurück, wenn der Rückgabetyp einer Methode Void ist? (Nicht ungültig!)

115

Aufgrund der Verwendung von Generics in Java musste ich schließlich eine Funktion mit Voiddem Rückgabetyp implementieren :

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

und der Compiler verlangt, dass ich etwas zurückgebe . Im Moment kehre ich gerade zurück null, aber ich frage mich, ob das eine gute Codierungspraxis ist ...

Ich frage nach V ‌oid, nicht nach V ‌oid. Die Klasse Void, nicht das reservierte Schlüsselwort void.

Ich habe auch versucht Void.class, void, Void.TYPE, new Void(), keine Rückkehr überhaupt, aber alles , was überhaupt nicht funktionieren. (Aus mehr oder weniger offensichtlichen Gründen) ( Einzelheiten finden Sie in dieser Antwort. )

  • Was soll ich also zurückgeben, wenn der Rückgabetyp einer Funktion ist Void?
  • Was ist die allgemeine Verwendung der VoidKlasse?
Daniel Rikowski
quelle

Antworten:

104

Was soll ich also zurückgeben, wenn der Rückgabetyp einer Funktion sein muss Void?

Verwenden Sie return null. Voidkann nicht instanziiert werden und ist lediglich ein Platzhalter für den Class<T>Typ von void.

Was ist der Sinn von Void?

Wie oben erwähnt, ist es ein Platzhalter. Voiderhalten Sie zurück, wenn Sie beispielsweise Reflection verwenden, um eine Methode mit einem Rückgabetyp von zu betrachten void. (Technisch gesehen werden Sie zurückkehren Class<Void>.) Es hat andere Verwendungszwecke in dieser Richtung, z. B. wenn Sie a parametrisieren möchten Callable<T>.

Aufgrund der Verwendung von Generika in Java musste ich diese Funktion implementieren

Ich würde sagen, dass etwas mit Ihrer API möglicherweise nicht stimmt, wenn Sie eine Methode mit dieser Signatur implementieren müssen. Überlegen Sie genau, ob es einen besseren Weg gibt, um das zu tun, was Sie wollen (vielleicht können Sie in einer anderen Folgefrage weitere Details angeben?). Ich bin ein wenig misstrauisch, da dies nur "aufgrund der Verwendung von Generika" kam.

John Feminella
quelle
13
Void zurückgeben zu müssen ist doch nicht so funky. Es kann einfach von zB Callable <T> beauftragt werden. Manchmal müssen Sie einfach nichts zurückgeben, können aber zB Runnable nicht verwenden.
Bombe
Leere hat legitime Verwendungen, wie ich bemerkte. Aber er sagte, dass "dies nur durch den Einsatz von Generika zustande kam". Das klingt so, als hätte er etwas mit einer Sammlung gemacht, die Void verwenden muss, was ich als ziemlich außergewöhnlichen Fall bezeichnen würde.
John Feminella
Bei Sammlungen wäre das in der Tat sehr seltsam.
Bombe
Sowohl Void.class als auch void.class sind Klasse <Void>, aber sie sind nicht gleich. Void wird häufig als generisches Argument für den Wert von Map (oder die Collections.newSetFromMap) und die Rückgabe von AccessController.doPrivileged verwendet.
Tom Hawtin - Tackline
@ Tom: Yeppers. Aus diesem Grund habe ich das Tag "(Technisch gesehen erhalten Sie die Klasse <Void>) zurück." Sollte ich diesen Teil ändern oder glauben Sie, dass er so wie er ist korrekt ist?
John Feminella
26

Es gibt keine Möglichkeit, eine Leere zu instanziieren. Sie können also nur null zurückgeben.

Jon Bright
quelle
13
Genauer gesagt gibt es keine Möglichkeit, eine Leere zu instanziieren, ohne böse Dinge zu tun.
Michael Myers
20

return null ist der Weg zu gehen.

Bombe
quelle
20

Um zu verdeutlichen, warum die anderen Vorschläge, die Sie gemacht haben, nicht funktionieren:

Void.classund Void.TYPEzeigen auf das gleiche Objekt und sind vom Typ Class<Void>, nicht von Void.

Aus diesem Grund können Sie diese Werte nicht zurückgeben. new Void()wäre vom Typ, Voidaber dieser Konstruktor existiert nicht. In der Tat Voidhat keine öffentlichen Konstruktoren und kann daher nicht instanziiert werden: Sie können nie ein Objekt vom Typ Voidaußer dem polymorphen haben null.

Hoffe das hilft! :-)

Martijn
quelle
1
Kleinere Korrektur: Void.TYPEzeigt nicht auf Void.class. Es zeigt auf void.class.
Shmosel
1

Wenn Sie diesen Typ aus unklaren Gründen verwenden MÜSSEN, scheint die Rückgabe von null tatsächlich eine sinnvolle Option zu sein, da der Rückgabewert vermutlich sowieso nicht verwendet wird.
Der Compiler zwingt Sie trotzdem, etwas zurückzugeben.
Und diese Klasse scheint keinen öffentlichen Konstruktor zu haben, so dass ein neues Void () nicht möglich ist.

PhiLho
quelle
Ich werde kein MUSS sein; es ist nur Konvention.
Tom Hawtin - Tackline
-2

genau wie dieser.

public Class TestClass {
    public void testMethod () {
        return;
    }
}
Jang-Ho Bae
quelle
2
Das OP sagte Voidnicht void. Die anderen Antworten scheinen das Thema bereits ziemlich gut abzudecken.
E_net4 erklärt