Co mam zwrócić, jeśli zwracanym typem metody jest Void? (Nieważne!)


115

Ze względu na użycie Generics w Javie musiałem zaimplementować funkcję mającą Voidjako typ zwracany:

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

a kompilator żąda, abym coś zwrócił . Na razie wracam null, ale zastanawiam się, czy to dobra praktyka kodowania ...

Pytam o V OID, a nie przeciwko oid. Klasa Void, a nie zastrzeżone słowo kluczowe void.

Próbowałem zostały również Void.class, void, Void.TYPE, new Void(), nie ma powrotu w ogóle, ale to nie działa w ogóle. (Z mniej lub bardziej oczywistych powodów) (Zobacz tę odpowiedź, aby uzyskać szczegółowe informacje)

  • Więc co mam zwrócić, jeśli zwracanym typem funkcji jest Void?
  • Jakie jest ogólne zastosowanie tej Voidklasy?

Odpowiedzi:


104

Więc co mam zwrócić, jeśli typ zwracania funkcji ma być Void?

Użyj return null. Voidnie można utworzyć wystąpienia i jest jedynie symbolem zastępczym dla Class<T>typu void.

Po co Void?

Jak wspomniano powyżej, jest to symbol zastępczy. Voidjest to, co otrzymasz, jeśli na przykład użyjesz odbicia, aby spojrzeć na metodę z zwracanym typem void. (Technicznie rzecz biorąc, wrócisz Class<Void>.) Ma inne różne zastosowania wzdłuż tych linii, na przykład jeśli chcesz sparametryzować plik Callable<T>.

Ze względu na użycie generyków w Javie musiałem zaimplementować tę funkcję

Powiedziałbym, że coś może być fajne z twoim API, jeśli potrzebujesz zaimplementować metodę z tym podpisem. Zastanów się dokładnie, czy istnieje lepszy sposób robienia tego, co chcesz (być może możesz podać więcej szczegółów w innym pytaniu uzupełniającym?). Jestem trochę podejrzliwy, ponieważ pojawił się tylko „z powodu użycia leków generycznych”.


13
Konieczność powrotu Void wcale nie jest taka fajna. Można go po prostu nakazać np. Callable <T>. Czasami po prostu nie musisz czegoś zwracać, ale nie możesz użyć np. Runnable.
Bombe

Void ma legalne zastosowania, jak zauważyłem. Powiedział jednak, że „stało się to tylko dzięki zastosowaniu leków generycznych”. To sprawia, że ​​brzmi to tak, jakby zrobił coś z kolekcją, która musi używać Void, co powiedziałbym, że jest to raczej wyjątkowy przypadek.
John Feminella,

W przypadku kolekcji byłoby to rzeczywiście bardzo dziwne.
Bombe,

Zarówno Void.class, jak i void.class należą do klasy <Void>, ale nie są równe. Void jest często używany jako ogólny argument w wartości Map (lub użyj Collection.newSetFromMap) i zwraca AccessController.doPrivileged.
Tom Hawtin - tackline

@Tom: Tak. Dlatego oznaczyłem „(Technicznie rzecz biorąc, odzyskasz klasę <Void>)”. Czy powinienem poprawić tę część, czy uważasz, że jest dokładna?
John Feminella,

26

Nie ma sposobu na utworzenie instancji Void, więc jedyne, co możesz zwrócić, to null.


13
Dokładniej, nie ma sposobu na utworzenie instancji Pustki bez robienia złych rzeczy.
Michael Myers


20

Aby wyjaśnić, dlaczego inne podane przez Ciebie sugestie nie działają:

Void.classi Void.TYPEwskazują na ten sam obiekt i są typu Class<Void>, a nie typu Void.

Dlatego nie możesz zwrócić tych wartości. new Void()byłby typu, Voidale ten konstruktor nie istnieje. W rzeczywistości Voidnie ma publicznych konstruktorów, więc nie można go utworzyć instancji: nigdy nie można mieć żadnego obiektu typu Voidpoza polimorficznym null.

Mam nadzieję że to pomoże! :-)


1
Niewielka korekta: Void.TYPEnie wskazuje Void.class. Wskazuje na void.class.
shmosel

1

Jeśli z niejasnych powodów MUSISZ użyć tego typu, to rzeczywiście zwrócenie wartości null wydaje się być rozsądną opcją, ponieważ przypuszczam, że wartość zwracana i tak nie zostanie użyta.
Kompilator i tak zmusi Cię do zwrócenia czegoś.
A ta klasa nie ma publicznego konstruktora, więc nowe Void () nie jest możliwe.


Nie będę MUSI; to tylko konwencja.
Tom Hawtin - tackline

-2

takie jak to.

public Class TestClass {
    public void testMethod () {
        return;
    }
}

2
OP powiedział Void, że nie void. Wydaje się, że inne odpowiedzi już całkiem dobrze pokrywają ten temat.
E_net4 robi sobie przerwę
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.