Apa yang saya kembalikan jika tipe pengembalian dari suatu metode adalah Void? (Tidak batal!)

115

Karena penggunaan Generik di Java, saya akhirnya harus mengimplementasikan fungsi yang memiliki Voidtipe kembali:

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

dan kompilator meminta saya mengembalikan sesuatu . Untuk saat ini saya baru saja kembali null, tetapi saya ingin tahu apakah itu praktik pengkodean yang baik ...

Saya bertanya tentang V ‌oid, bukan v ‌oid. Kelas Void, bukan kata kunci yang dipesan void.

Saya juga sudah mencoba Void.class, void, Void.TYPE, new Void(), tidak kembali sama sekali, tapi semua itu tidak bekerja sama sekali. (Untuk alasan yang kurang lebih jelas) (Lihat jawaban ini untuk detailnya)

  • Jadi apa yang harus saya kembalikan jika tipe kembalian dari suatu fungsi adalah Void?
  • Apa kegunaan umum Voidkelas?
Daniel Rikowski
sumber

Jawaban:

104

Jadi apa yang harus saya kembalikan jika tipe kembalian dari suatu fungsi harus Void?

Gunakan return null. Voidtidak bisa dibuat instance-nya dan hanya merupakan placeholder untuk Class<T>jenis void.

Apa gunanya Void?

Seperti disebutkan di atas, ini adalah placeholder. Voidadalah apa yang akan Anda dapatkan jika, misalnya, menggunakan refleksi untuk melihat metode dengan tipe kembalian void. (Secara teknis, Anda akan kembali Class<Void>.) Ini memiliki berbagai macam kegunaan lainnya di sepanjang baris ini, seperti jika Anda ingin membuat parameter a Callable<T>.

Karena penggunaan generik di Java, saya akhirnya harus mengimplementasikan fungsi ini

Saya akan mengatakan bahwa ada sesuatu yang mungkin funky dengan API Anda jika Anda perlu menerapkan metode dengan tanda tangan ini. Pertimbangkan baik-baik apakah ada cara yang lebih baik untuk melakukan apa yang Anda inginkan (mungkin Anda dapat memberikan detail lebih lanjut dalam pertanyaan lanjutan yang berbeda?). Saya sedikit curiga, karena ini hanya muncul "karena penggunaan obat generik".

John Feminella
sumber
13
Harus mengembalikan Void tidak terlalu funky. Ini hanya dapat diamanatkan oleh misalnya Callable <T>. Terkadang Anda tidak perlu mengembalikan sesuatu tetapi tidak dapat menggunakan, misalnya, Dapat dijalankan.
Bombe
Void memiliki kegunaan yang sah, seperti yang saya catat. Tetapi dia mengatakan bahwa "ini hanya muncul karena penggunaan obat generik". Itu membuatnya terdengar seperti dia melakukan sesuatu pada koleksi yang perlu menggunakan Void, yang menurut saya adalah kasus yang agak luar biasa.
John Feminella
Dengan koleksinya memang akan sangat aneh.
Bombe
Baik Void.class dan void.class adalah Kelas <Void> tetapi keduanya tidak sama. Void sering digunakan sebagai argumen umum dalam nilai Map (atau gunakan Collections.newSetFromMap) dan kembalian AccessController.doPrivileged.
Tom Hawtin - tackline
@ Tom: Yeppers. Itulah mengapa saya menandai "(Secara teknis, Anda akan mendapatkan kembali Kelas <Void>.)" Haruskah saya mengubah bagian itu atau menurut Anda itu akurat?
John Feminella
26

Tidak ada cara untuk membuat instance Void, jadi satu-satunya hal yang dapat Anda kembalikan adalah null.

Jon Bright
sumber
13
Lebih tepatnya, tidak ada cara untuk membuat Void tanpa melakukan hal-hal jahat.
Michael Myers
20

return null adalah cara untuk pergi.

Bombe
sumber
20

Untuk memperjelas mengapa saran lain yang Anda berikan tidak berhasil:

Void.classdan Void.TYPEmenunjuk ke objek yang sama dan bertipe Class<Void>, bukan dari Void.

Itulah mengapa Anda tidak bisa mengembalikan nilai-nilai itu. new Void()akan menjadi tipe Voidtetapi konstruktor itu tidak ada. Faktanya, Voidtidak memiliki konstruktor publik sehingga tidak dapat dibuat instance-nya: Anda tidak pernah dapat memiliki objek berjenis apa pun Voidkecuali polimorfik null.

Semoga ini membantu! :-)

Martijn
sumber
1
Koreksi kecil: Void.TYPEtidak mengarah ke Void.class. Itu menunjuk ke void.class.
shmosel
1

Jika, karena alasan yang tidak jelas, Anda HARUS menggunakan tipe ini, maka memang mengembalikan null tampaknya merupakan opsi yang masuk akal, karena saya kira nilai yang dikembalikan tidak akan digunakan.
Kompiler akan memaksa Anda untuk mengembalikan sesuatu.
Dan kelas ini tampaknya tidak memiliki konstruktor publik sehingga Void () baru tidak memungkinkan.

PhiLho
sumber
Saya tidak akan menjadi HARUS; itu hanya konvensi.
Tom Hawtin - tackline
-2

seperti ini.

public Class TestClass {
    public void testMethod () {
        return;
    }
}
Jang-Ho Bae
sumber
2
OP mengatakan Void, tidak void. Jawaban-jawaban lain sepertinya sudah mencakup subjek dengan cukup baik.
E_net4 menjauh dari Meta