Bir yöntemin dönüş türü Void ise ne döndürürüm? (Boş değil!)


115

Java'da Generics kullanımı nedeniyle Voiddönüş türü olan bir işlevi uygulamak zorunda kaldım :

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

ve derleyici bir şey döndürmemi istiyor . Şimdilik sadece geri dönüyorum nullama bunun iyi bir kodlama uygulaması olup olmadığını merak ediyorum ...

V ‌oid hakkında soruyorum , v ‌oid değil . Sınıf Void, değil ayrılmış anahtar kelime void.

Ben de denedim Void.class, void, Void.TYPE, new Void(), hiç çalışmaz hiçbir hiç dönüş, ancak tüm. (Az ya da çok belirgin nedenler için) (Ayrıntılar için bu yanıta bakın)

  • Öyleyse, bir işlevin dönüş türü ise ne döndürmeliyim? Void ?
  • VoidSınıfın genel kullanımı nedir ?

Yanıtlar:


104

Öyleyse, bir işlevin dönüş türü olması gerekiyorsa ne döndürmem gerekiyor Void?

Kullanın return null. Voidsomutlaştırılamaz ve yalnızca Class<T>türü için bir yer tutucudur void.

Ne anlamı var Void?

Yukarıda belirtildiği gibi, bu bir yer tutucudur. Voiddönüş türü olan bir yönteme bakmak için yansıma kullanırsanız, geri alacağınız şeydir void. (Teknik olarak, geri döneceksiniz Class<Void>.) Bu satırlar boyunca başka çeşitli kullanımları vardır, örneğin a Callable<T>.

Java'da jenerik kullanımı nedeniyle bu işlevi uygulamak zorunda kaldım

Bu imzayla bir yöntem uygulamanız gerekirse, API'nizle ilgili bir şeylerin garip olabileceğini söyleyebilirim. İstediğinizi yapmanın daha iyi bir yolu olup olmadığını dikkatlice düşünün (belki farklı, takip eden bir soruda daha fazla ayrıntı sağlayabilirsiniz?). Biraz şüpheliyim, çünkü bu sadece "jeneriklerin kullanımı nedeniyle" ortaya çıktı.


13
Ne de olsa Void'e geri dönmek o kadar da korkak değil. Örneğin Callable <T> ile basitçe yetkilendirilebilir. Bazen bir şeyi iade etmeniz gerekmez, ancak örneğin Runnable'ı kullanamazsınız.
Bombe

Daha önce de belirttiğim gibi Void'in meşru kullanımları var. Ancak "bu sadece jenerik ilaçların kullanımıyla ortaya çıktı" dedi. Bu, Void'i kullanması gereken bir koleksiyona bir şeyler yapmış gibi görünmesine neden oluyor, ki bu oldukça istisnai bir durum.
John Feminella

Koleksiyonlarla gerçekten çok garip olurdu.
Bombe

Hem Void.class hem de void.class <Void> Sınıfıdır ancak eşit değildirler. Void, genellikle Map değerinde (veya Collections.newSetFromMap'i kullanın) ve AccessController.doPrivileged'in dönüşünde genel bir bağımsız değişken olarak kullanılır.
Tom Hawtin - tackline

@ Tom: Evet. Bu yüzden "(Teknik olarak <Void> Sınıfını geri alacaksınız.)" Bu bölümü düzeltmeli miyim yoksa sizce olduğu gibi doğru mu?
John Feminella

26

Orada bir Void örneğini yolu yok, bu yüzden tek şey olabilir dönmek boş.


13
Daha doğrusu, kötü şeyler yapmadan bir Boşluğu başlatmanın bir yolu yoktur.
Michael Myers


20

Verdiğiniz diğer önerilerin neden işe yaramadığını netleştirmek için:

Void.classve Void.TYPEaynı nesneye işaret eder ve türü Class<Void>değil, türündedir Void.

Bu yüzden bu değerleri geri veremezsiniz. new Void()tür olabilir, Voidancak bu kurucu mevcut değil. Aslında, Voidpublic kurucuları yoktur ve bu nedenle somutlaştırılamaz: VoidPolimorfik dışında hiçbir tür nesneye sahip olamazsınız.null .

Bu yardımcı olur umarım! :-)


1
Küçük düzeltme: Void.TYPEişaret etmiyor Void.class. İşaret ediyor void.class.
shmosel

1

Eğer, belirsiz nedenlerden dolayı, bu türü kullanmanız ZORUNLUysa, o zaman gerçekten de boş değer döndürmek mantıklı bir seçenek gibi görünüyor, çünkü geri dönüş değerinin zaten kullanılmayacağını düşünüyorum.
Derleyici sizi yine de bir şey döndürmeye zorlayacaktır.
Ve bu sınıfın genel bir kurucusu yok gibi görünüyor, bu nedenle yeni Void () mümkün değil.


Ben bir zorunluluk olmayacağım; bu sadece bir gelenektir.
Tom Hawtin - tackline

-2

aynen böyle.

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

2
OP Void, hayır dedi void. Diğer cevaplar zaten konuyu oldukça iyi kapsıyor gibi görünüyor.
E_net4
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.