Mengapa Java menggunakan :: untuk referensi metode alih-alih.?


7

Saya sering bertanya-tanya mengapa Java menggunakan ::referensi metode alih-alih ., misalnya mengapa menulis

  System.out::println

dari pada

  System.out.println

Tentu saja, orang mungkin hanya menjawab: "karena para desainer memutuskan demikian". Di sisi lain, saya akan mengharapkan sintaks kedua karena titik adalah sintaks Java yang biasa untuk mengakses anggota kelas.

Jadi adakah alasan khusus yang diketahui untuk memperkenalkan ::sintaks baru alih-alih menggunakan .konvensi yang ada untuk referensi metode?

Jawaban:


20

Ini untuk menghindari ambiguitas jika kelas memiliki anggota (statis) dengan nama yang sama dengan metode (Java mengizinkannya).

Sangat mudah untuk melihat dari cuplikan kode di tutorial Java tentang referensi metode :

Karena ekspresi lambda ini memanggil metode yang sudah ada, Anda bisa menggunakan referensi metode alih-alih ekspresi lambda:

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

Jika kelas Persondalam cuplikan di atas juga akan memiliki anggota bernama compareByAge(dari jenis yang sesuai untuk diteruskan Arrays.sort), notasi titik tidak akan memungkinkan untuk mengetahui apakah parameter merujuk ke metode atau anggota.


2
Terima kasih atas jawabannya dan maafkan ketidaktahuan saya: Saya tidak tahu bahwa variabel anggota dan metode diizinkan untuk memiliki nama yang sama. +1
Giorgio

3

Mereka memperkenalkan sintaksis baru karena perilakunya tidak sama.

The .berarti bahwa Anda ingin mendapatkan referensi pada fungsi untuk memanggil itu tepat setelah.

Bila Anda menggunakan referensi metode ( ::) Anda ingin menyimpan referensi pada fungsi tetapi Anda tidak ingin memohon segera.

Aspek yang lebih praktis adalah bagaimana Anda membedakan antara atribut publik dan metode yang memiliki nama yang sama dengan .? Anda tidak bisa. Dengan ::tidak ada lagi ambiguitas.


"The. Berarti menjalankan fungsi, secara harfiah menjalankan kodenya." Tidak, titik berarti mengakses anggota. Tanda kurung berarti menjalankan fungsi dalam bahasa dengan sintaks C-style (seperti Java).
Rute Mil

1
@MilesRout Memang jawaban saya membingungkan, saya telah mengeditnya untuk lebih memperjelas pikiran saya.
Melihat
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.