Perché Java usa :: per i riferimenti ai metodi invece di.?

9

Spesso mi chiedo perché Java usi :: per i riferimenti al metodo anziché . , ad es. perché scrivere

  System.out::println

invece di

  System.out.println

Naturalmente, si potrebbe semplicemente rispondere: "perché i progettisti hanno deciso così". D'altra parte, mi sarei aspettato la seconda sintassi perché il punto è la solita sintassi Java per l'accesso ai membri della classe.

Quindi esiste qualche motivo speciale noto per l'introduzione della nuova sintassi :: invece di utilizzare la convenzione . esistente per i riferimenti al metodo?

    
posta Giorgio 03.11.2016 - 07:45
fonte

2 risposte

19

Questo per evitare ambiguità nel caso in cui la classe abbia un membro (statico) con lo stesso nome del metodo (Java lo consente).

È facile vedere dallo snippet di codice in tutorial Java sui riferimenti ai metodi :

Because this lambda expression invokes an existing method, you can use a method reference instead of a lambda expression:

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

Se la classe Person nello snippet sopra avrebbe anche un membro chiamato compareByAge (del tipo appropriato da passare a Arrays.sort ), la notazione a punti non consentirebbe di stabilire se il parametro si riferisce al metodo o al membro.

    
risposta data 03.11.2016 - 07:58
fonte
2

Hanno introdotto una nuova sintassi perché il comportamento non è lo stesso.

Il . significa che vuoi ottenere un riferimento sulla funzione per richiamare subito dopo.

Quando si utilizza il riferimento al metodo ( :: ) si desidera memorizzare un riferimento sulla funzione ma non si desidera richiamarlo immediatamente.

Un aspetto più pratico è come distinguere tra un attributo pubblico e un metodo con lo stesso nome con . ? Semplicemente non puoi. Con :: non c'è più ambiguità.

    
risposta data 03.11.2016 - 09:53
fonte

Leggi altre domande sui tag