Tại sao Java sử dụng :: cho các tham chiếu phương thức thay vì.?


7

Tôi thường tự hỏi tại sao Java sử dụng ::cho các tham chiếu phương thức thay vì ., ví dụ tại sao lại viết

  System.out::println

thay vì

  System.out.println

Tất nhiên, người ta có thể trả lời đơn giản: "bởi vì các nhà thiết kế đã quyết định như vậy". Mặt khác, tôi đã mong đợi cú pháp thứ hai vì dấu chấm là cú pháp Java thông thường để truy cập các thành viên của lớp.

Vì vậy, có bất kỳ lý do đặc biệt được biết đến để giới thiệu ::cú pháp mới thay vì sử dụng .quy ước hiện có cho các tham chiếu phương thức?

Câu trả lời:


20

Điều này là để tránh sự mơ hồ trong trường hợp nếu lớp có thành viên (tĩnh) có cùng tên với phương thức (Java cho phép điều đó).

Có thể dễ dàng nhìn thấy từ đoạn mã trong hướng dẫn Java về các tham chiếu phương thức :

Vì biểu thức lambda này gọi một phương thức hiện có, bạn có thể sử dụng tham chiếu phương thức thay vì biểu thức lambda:

Arrays.sort(rosterAsArray, Person::compareByAge);

Nếu lớp Persontrong đoạn trích trên cũng có tên thành viên compareByAge(thuộc loại thích hợp để chuyển đến Arrays.sort), ký hiệu dấu chấm sẽ không cho phép biết tham số có tham chiếu đến phương thức hoặc thành viên hay không.


2
Cảm ơn câu trả lời và tha thứ cho sự thiếu hiểu biết của tôi: Tôi không biết rằng các biến và phương thức thành viên được phép có cùng tên. +1
Giorgio

3

Họ đã giới thiệu một cú pháp mới vì hành vi không giống nhau.

.nghĩa là bạn muốn có được một tham chiếu về hàm để gọi nó ngay sau đó.

Khi bạn sử dụng tham chiếu phương thức ( ::) bạn muốn lưu trữ một tham chiếu trên hàm nhưng bạn không muốn gọi nó ngay lập tức.

Một khía cạnh thực tế hơn là làm thế nào bạn phân biệt giữa một thuộc tính công khai và một phương thức có cùng tên với .? Bạn chỉ đơn giản là không thể. Với ::không có sự mơ hồ hơn.


". Có nghĩa là gọi hàm, thực thi mã của nó." Không, dấu chấm có nghĩa là truy cập thành viên. Các dấu ngoặc có nghĩa là gọi hàm trong các ngôn ngữ với cú pháp kiểu C (như Java).
Miles Rout

1
@MilesRout Quả thực câu trả lời của tôi rất khó hiểu, tôi đã chỉnh sửa nó để làm rõ hơn suy nghĩ của mình.
Phát hiện
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.