¿Por qué Java utiliza :: para referencias de métodos en lugar de.?

7

A menudo me pregunto por qué Java usa ::para referencias de métodos en lugar de ., por ejemplo, por qué escribir

  System.out::println

en vez de

  System.out.println

Por supuesto, uno podría simplemente responder: "porque los diseñadores así lo decidieron". Por otro lado, hubiera esperado la segunda sintaxis porque el punto es la sintaxis Java habitual para acceder a los miembros de la clase.

Entonces, ¿hay alguna razón especial conocida para introducir la nueva ::sintaxis en lugar de usar la .convención existente para referencias de métodos?

Giorgio
fuente

Respuestas:

20

Esto es para evitar ambigüedades en caso de que la clase tenga un miembro (estático) con el mismo nombre que el método (Java lo permite).

Es fácil ver desde el fragmento de código en el tutorial de Java sobre referencias de métodos :

Debido a que esta expresión lambda invoca un método existente, puede usar una referencia de método en lugar de una expresión lambda:

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

Si la clase Personen el fragmento anterior también tuviera un miembro llamado compareByAge(del tipo apropiado para pasar Arrays.sort), la notación de puntos no permitiría decir si el parámetro se refiere al método o al miembro.

mosquito
fuente
2
Gracias por la respuesta y disculpe mi ignorancia: no sabía que las variables y los métodos miembros podían tener el mismo nombre. +1
Giorgio el
3

Introdujeron una nueva sintaxis porque el comportamiento no es el mismo.

Esto .significa que desea obtener una referencia sobre la función para invocarla inmediatamente después.

Cuando utiliza la referencia de método ( ::), desea almacenar una referencia en la función pero no desea invocarla de inmediato.

Un aspecto más práctico es cómo diferenciar entre un atributo público y un método que tiene el mismo nombre con el .? Simplemente no puedes. Con ::no hay más ambigüedad.

Manchado
fuente
"El. Significa invocar la función, literalmente ejecutar su código". No, el punto significa acceder al miembro. Los paréntesis significan invocar la función en lenguajes con sintaxis de estilo C (como Java).
Miles Rout
1
@MilesRout De hecho, mi respuesta es confusa, la he editado para aclarar mejor mis pensamientos.
Visto el