ฉันจะส่งคืนอะไรหากประเภทการส่งคืนของเมธอดเป็นโมฆะ (ไม่เป็นโมฆะ!)


115

เนื่องจากการใช้ Generics ใน Java ฉันจึงต้องใช้ฟังก์ชันที่มีVoidประเภท return:

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

และคอมไพเลอร์เรียกร้องให้ผมกลับมาบางสิ่งบางอย่าง ตอนนี้ฉันเพิ่งกลับมาnullแต่ฉันสงสัยว่านั่นเป็นการฝึกเขียนโค้ดที่ดีหรือไม่ ...

ฉันกำลังถามเกี่ยวกับV ‌oid ไม่ใช่v ‌oid ชั้นVoid, ไม่voidคำหลักที่สงวนไว้

ฉันได้ลองVoid.classแล้วvoidเช่นVoid.TYPEกันnew Void()ไม่กลับมาเลย แต่ทั้งหมดนั้นไม่ได้ผลเลย (ด้วยเหตุผลที่ชัดเจนมากหรือน้อย) (ดูรายละเอียดคำตอบนี้ )

  • แล้วฉันควรจะส่งคืนอะไรถ้าประเภทการส่งคืนของฟังก์ชันคือVoidอะไร?
  • การใช้งานทั่วไปของVoidคลาสคืออะไร?

คำตอบ:


104

แล้วฉันควรจะส่งคืนอะไรถ้าประเภทการส่งคืนของฟังก์ชันต้องเป็นVoid?

ใช้return null. Voidไม่สามารถสร้างอินสแตนซ์ได้และเป็นเพียงตัวยึดสำหรับClass<T>ประเภทของvoid.

ประเด็นVoidคืออะไร?

ดังที่ระบุไว้ข้างต้นเป็นตัวยึดตำแหน่ง คือสิ่งที่คุณจะได้รับกลับหากคุณตัวอย่างเช่นการใช้การสะท้อนไปดูที่วิธีการที่มีประเภทการกลับมาของVoid void(ในทางเทคนิคคุณจะได้รับกลับมาClass<Void>) มันมีการใช้งานอื่น ๆ ที่หลากหลายตามบรรทัดเหล่านี้เช่นหากคุณต้องการกำหนดพารามิเตอร์ a Callable<T>.

เนื่องจากการใช้ generics ใน Java ฉันจึงต้องใช้ฟังก์ชันนี้

ฉันจะบอกว่า API ของคุณอาจมีบางอย่างที่ไม่น่าสนใจหากคุณต้องการใช้วิธีการที่มีลายเซ็นนี้ พิจารณาอย่างรอบคอบว่ามีวิธีที่ดีกว่าในการทำสิ่งที่คุณต้องการหรือไม่ (คุณอาจให้รายละเอียดเพิ่มเติมในคำถามติดตามผลอื่น) ฉันสงสัยเล็กน้อยเนื่องจากสิ่งนี้เกิดขึ้น "เนื่องจากการใช้ยาสามัญ"


13
การต้องคืน Void ไม่ใช่เรื่องขี้ขลาดเลย มันสามารถบังคับได้โดยเช่น Callable <T> บางครั้งคุณไม่จำเป็นต้องคืนสินค้า แต่ไม่สามารถใช้เช่น Runnable
Bombe

โมฆะมีการใช้งานที่ถูกต้องตามที่ฉันสังเกตเห็น แต่เขาบอกว่า "สิ่งนี้เกิดขึ้นเนื่องจากการใช้ยาชื่อสามัญ" นั่นทำให้ดูเหมือนว่าเขาทำอะไรบางอย่างกับคอลเล็กชันที่จำเป็นต้องใช้ Void ซึ่งฉันจะบอกว่าเป็นกรณีที่ค่อนข้างพิเศษ
John Feminella

ด้วยคอลเลกชันมันจะแปลกมากแน่นอน
Bombe

ทั้ง Void.class และ void.class เป็น Class <Void> แต่ไม่เท่ากัน Void มักใช้เป็นอาร์กิวเมนต์ทั่วไปในค่าของ Map (หรือใช้ Collections.newSetFromMap) และการส่งคืน AccessController.doPrivileged
Tom Hawtin - แท็กไลน์

@ ทอม: Yeppers นั่นเป็นเหตุผลที่ฉันติดแท็ก "(ในทางเทคนิคแล้วคุณจะได้รับ Class <Void> กลับคืนมา)" ฉันควรแก้ไขส่วนนั้นหรือคุณคิดว่าถูกต้องตามที่เป็นอยู่?
John Feminella

26

ไม่มีทางที่จะสร้างอินสแตนซ์ Void ได้ดังนั้นสิ่งเดียวที่คุณสามารถคืนค่าเป็นโมฆะ


13
ถูกต้องมากขึ้นไม่มีวิธีใดที่จะทำให้เกิดความว่างเปล่าโดยไม่ทำสิ่งชั่วร้าย
Michael Myers


20

เพื่อให้ชัดเจนว่าเหตุใดคำแนะนำอื่น ๆ ที่คุณให้จึงไม่ได้ผล

Void.classและVoid.TYPEชี้ไปที่วัตถุเดียวกันและเป็นชนิดที่ไม่ได้ของClass<Void>Void

นั่นคือเหตุผลที่คุณไม่สามารถคืนค่าเหล่านั้นได้ new Void()จะเป็นประเภทVoidแต่ตัวสร้างนั้นไม่มีอยู่จริง ในความเป็นจริงVoidยังไม่มีการก่อสร้างภาครัฐและจึงไม่สามารถ instantiated: คุณไม่สามารถมีวัตถุชนิดใด ๆVoidยกเว้น nullpolymorphic

หวังว่านี่จะช่วยได้! :-)


1
แก้ไขไมเนอร์: ไม่ได้ชี้ไปVoid.TYPE มันชี้ไปที่Void.class void.class
shmosel

1

หากด้วยเหตุผลที่คลุมเครือคุณต้องใช้ประเภทนี้การคืนค่า null ดูเหมือนจะเป็นตัวเลือกที่สมเหตุสมผลเนื่องจากฉันคิดว่าค่าส่งคืนจะไม่ถูกใช้
คอมไพเลอร์จะบังคับให้คุณส่งคืนบางสิ่งอยู่ดี
และคลาสนี้ดูเหมือนจะไม่มีตัวสร้างสาธารณะดังนั้นจึงไม่สามารถสร้าง Void () ใหม่ได้


ฉันจะไม่ต้อง; มันเป็นเพียงการประชุม
Tom Hawtin - แท็กไลน์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.