Tôi trả về cái gì nếu kiểu trả về của một phương thức là Void? (Không vô hiệu!)


115

Do việc sử dụng Generics trong Java, tôi đã phải triển khai một hàm có Voidkiểu trả về:

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

và trình biên dịch yêu cầu tôi trả lại một cái gì đó . Bây giờ tôi mới quay trở lại null, nhưng tôi đang tự hỏi liệu đó có phải là phương pháp viết mã tốt ...

Tôi đang hỏi về V oid, không phải v oid. Lớp Void, không phải từ khóa dành riêng void.

Tôi cũng đã cố gắng Void.class, void, Void.TYPE, new Void(), không trở lại ở tất cả, nhưng tất cả những gì không làm việc ở tất cả. (Vì những lý do rõ ràng hơn hoặc ít hơn) (Xem câu trả lời này để biết chi tiết)

  • Vì vậy, những gì tôi phải trả về nếu kiểu trả về của một hàm là Void?
  • Công dụng chung của Voidlớp học là gì?

Câu trả lời:


104

Vậy tôi phải trả về cái gì nếu kiểu trả về của một hàm phải là Void?

Sử dụng return null. Voidkhông thể được khởi tạo và chỉ là một trình giữ chỗ cho Class<T>loại void.

Mục đích là Voidgì?

Như đã nói ở trên, đó là một trình giữ chỗ. Voidlà những gì bạn sẽ nhận lại nếu bạn, ví dụ, sử dụng phản chiếu để xem một phương thức có kiểu trả về void. (Về mặt kỹ thuật, bạn sẽ lấy lại được Class<Void>.) Nó có các loại sử dụng khác dọc theo những dòng này, giống như nếu bạn muốn tham số hóa a Callable<T>.

Do việc sử dụng generic trong Java, tôi đã kết thúc bằng việc triển khai chức năng này

Tôi muốn nói rằng điều gì đó có thể xảy ra với API của bạn nếu bạn cần triển khai một phương pháp với chữ ký này. Hãy xem xét cẩn thận xem có cách nào tốt hơn để làm những gì bạn muốn (có lẽ bạn có thể cung cấp thêm chi tiết trong một câu hỏi tiếp theo khác?). Tôi hơi nghi ngờ, vì điều này chỉ xuất hiện "do việc sử dụng thuốc generic".


13
Rốt cuộc thì việc phải quay trở lại Void không phải là thú vị như vậy. Nó chỉ có thể được ủy quyền bởi ví dụ Callable <T>. Đôi khi bạn không cần trả lại một cái gì đó nhưng không thể sử dụng như Runnable.
Bombe

Void có những cách sử dụng hợp pháp, như tôi đã lưu ý. Nhưng ông nói rằng "điều này chỉ xuất hiện do việc sử dụng thuốc generic". Điều đó khiến có vẻ như anh ấy đã làm gì đó với một bộ sưu tập cần sử dụng Void, mà tôi có thể nói là một trường hợp khá đặc biệt.
John Feminella

Với các bộ sưu tập, nó sẽ rất kỳ lạ, thực sự.
Bombe

Cả Void.class và void.class đều là Class <Void> nhưng chúng không bằng nhau. Void thường được sử dụng như một đối số chung trong giá trị của Map (hoặc sử dụng Collections.newSetFromMap) và trả về của AccessController.doPrivileged.
Tom Hawtin - tắc bóng vào

@Tom: Yeppers. Đó là lý do tại sao tôi đã gắn thẻ "(Về mặt kỹ thuật, bạn sẽ lấy lại Lớp <Void>.)" Tôi có nên sửa đổi phần đó hay bạn nghĩ nó chính xác như vậy?
John Feminella

26

Không có cách nào để tạo Void, vì vậy thứ duy nhất bạn có thể trả về là null.


13
Chính xác hơn, không có cách nào tạo ra Void mà không làm những điều xấu xa.
Michael Myers


20

Để làm rõ lý do tại sao các đề xuất khác mà bạn đưa ra không hoạt động:

Void.classVoid.TYPEtrỏ đến cùng một đối tượng và thuộc loại Class<Void>, không thuộc loại Void.

Đó là lý do tại sao bạn không thể trả lại các giá trị đó. new Void()sẽ thuộc loại Voidnhưng hàm tạo đó không tồn tại. Trên thực tế, Voidkhông có hàm tạo công khai nào và do đó không thể được khởi tạo: Bạn không bao giờ có thể có bất kỳ đối tượng nào thuộc kiểu Voidngoại trừ đối tượng đa hình null.

Hi vọng điêu nay co ich! :-)


1
Chỉnh sửa nhỏ: Void.TYPEkhông trỏ tới Void.class. Nó chỉ đến void.class.
shmosel

1

Nếu, vì những lý do khó hiểu, bạn PHẢI sử dụng kiểu này, thì thực sự trả về null có vẻ là một lựa chọn hợp lý, vì tôi cho rằng giá trị trả về sẽ không được sử dụng.
Trình biên dịch sẽ buộc bạn trả lại một cái gì đó.
Và lớp này dường như không có hàm tạo công khai nên không thể thực hiện được Void () mới.


Tôi sẽ không PHẢI; nó chỉ là quy ước.
Tom Hawtin - chạm bóng vào

-2

chỉ như thế này.

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

2
OP nói Void, không phải void. Các câu trả lời khác dường như đã bao quát chủ đề khá tốt.
E_net4 tránh xa Meta
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.