2017-10-17 17 views
5

Chúng ta đều biết rằng Optional<T> có phương thức T get(), vậy tại sao nó không thực hiện Supplier<T>?Tại sao tùy chọn <T> không triển khai Nhà cung cấp <T>?

Nếu không có lý do tại sao, nó sẽ phá vỡ bất kỳ mã nào trước đây nếu Oracle đã triển khai nó vào một phiên bản Java trong tương lai?

+4

Nó làm tăng ngoại lệ 'NoSuchElementException' nếu nó trống; trong trạng thái trống rỗng của nó, nó không phải là 'Nhà cung cấp'. – teppic

+2

Bạn không nên sử dụng 'Tùy chọn # get()', vì vậy nó thực sự là một điều tốt nó không thực hiện giao diện đó. – Tom

+0

@teppic Nhưng đó là một ngoại lệ không được kiểm soát, vậy vấn đề là gì? –

Trả lời

7

Đó là vì chúng có ý nghĩa khác nhau.

An Optional<T> là một đối số có thể hoặc không được cung cấp, giá trị trả về có thể hoặc không được cung cấp hoặc biến có thể hoặc không được gán giá trị. Nếu nó có giá trị, bạn có thể sử dụng .get() để truy xuất. .get() có thể ném một ngoại lệ nếu bạn làm điều gì đó sai, tức là, nếu bạn gọi nó khi giá trị không có.

A Supplier<T> là một đối tượng chức năng sẽ cung cấp giá trị (hoặc null) theo yêu cầu. Không giống như một Optional<T>, nó hợp lý cho Supplier.get() để trả lại một giá trị khác nhau mỗi khi bạn gọi nó. Nếu Supplier.get() ném một ngoại lệ, điều đó có nghĩa là đã xảy ra sự cố khi triển khai, không phải là người gọi đã mắc lỗi.

+0

Câu trả lời rất rõ ràng và súc tích. – Zhro

2

@MattTimmermans explains, không có lý do logic nào cho Optional để triển khai Supplier. Tuy nhiên, các tham chiếu phương thức của Java làm cho nó rất dễ chuyển đổi giữa các giao diện chia sẻ cùng một chữ ký chức năng. Với số Optional<T> o, bạn có thể chuyển cho bất kỳ phương thức hoặc biến nào mong đợi một Supplier<T> dưới dạng o::get.

2

Không có giao diện nào trong gói java.util.function có các lớp thực hiện (ít nhất là các lớp nền tảng Java). Tôi nghĩ rằng điều này là do các giao diện này không được thiết kế cho bất kỳ mục đích nào khác, nhưng, như mô tả gói cho biết, để cung cấp các kiểu đích cho các biểu thức lambda và các tham chiếu phương thức.

Các vấn đề liên quan