L’Early Binding in Java – Lezione 6 di Java Avanzato

L’Early Binding è il meccanismo con cui il compilatore individua la firma migliore per un’invocazione a metodo. Suddivide il processo in due parti:

  1. Individuazione delle firme candidate;
  2. Individuazione della firma più specifica.

Individure le firme candidate

Fase 1. Nella prima fase dell’Early Binding è possibile individuare, attraverso delle semplici regole, le firme candidate adatte all’invocazione di un metodo. In Java per firma si intende il nome e il tipo dei parametri e possiamo dire che:

Data una firma f(T1, …, Tn), con stesso nome ed argomenti, è detta candidata se:

  1. Si trova in un metodo nella stessa classe o nelle sue superclassi;
  2. Il metodo è visibile dal punto in cui è stata effettuata l’invocazione;
  3. Gli argomenti del metodo sono compatibili, ovvero che ogni argomento è assegnabile al rispettivo tipo del parametro nella stessa identica posizione.

Si cercano quindi dal tipo dichiarato di x e dalle sue superclassi, le firme dei metodi compatibili. Un metodo viene detto compatibile quando ha la stessa firma e i tipi degli argomenti sono assegnabili.

Alla fine di questa fase si ottiene la tabella delle firme compatibili con l’invocazione a mettodo effettuata (eventuali firme ridondanti vengono eliminate). Questa tabella può essere anche vuota, in questo caso avremo un errore di compilazione perché non è stato trovato nessun metodo compatibile con la chiamata effettuata.

Calcolo della firma candidata più specifica

Fase 2. Nella seconda fase dell’Early Binding viene scelta una firma dalla tabella ottenuta nella prima fase. In particolare, date due firme:

  1. f(T1, …, Tn)
  2. f(U1, …, Un)

Con lo stesso nome e numero di parametri: la prima firma è più specifica della seconda firma se e solo se per ogni i=1, …, n tale che Ti è assegnabile a Ui.

Si tratta di una relazione d’ordine basata sull’assegnabilità di tipo riflessivo, antisimmetrico e transitivo.

Dalla fase 2 dell’Early Binding uscirà la firma più specifica, ovvero quella firma più specifica tra tutte le firme candidate a quell’invocazione. Anche se esistessero dei metodi ambigui (in contrasto tra di loro), se esiste tra tutte le firma una firma più specifica delle altre, l’invocazione del metodo non produrrà errori. Per il compilatore è essenziale che esisti una ed una sola firma più specifica con l’invocazione effettuata.

Siccome non è possibile effettuare l’overriding dei metodi static, final o private la fase 2 non verrà mai eseguita. Dato che questi metodi non possono essere stati sovrapposti, già si conosce il metodo che verrà effettivamente chiamato e lo si può già restituire direttamente.

Riprendendo l’esempio proposto nella lezione precedente, avevamo due metodi a disposizione:

  public void f(double x, long y){}
  public void f(int x, double y){}

Con l’invocazione del metodo x.f(1,2) avremo che:

  1. Il tipo double del primo metodo non è assegnabile ad int del secondo metodo, mentre long del primo metodo è assegnabile a double del secondo metodo;
  2. Al contrario, int del secondo metodo è assegnabile a double del primo metodo, e double del secondo metodo non è assegnabile a long del primo metodo.

Dato che nessuna firma è assegnabile ad un’altra avremo un errore di compilazione, in questo caso si parla di errore per ambiguità in quanto non esiste nessuna firma più specifica delle altre.

Per scegliere una firma tra molti metodi, un modo molto pratico è di quello disegnare un grafo. Rappresentando un nodo per ogni firma candidata uscita dalla fase 1, disegneremo un arco da i a j se i è più specifico di j. Dato che la relazione è riflessiva, ogni nodo avrà un self-loop che quindi può essere “ignorato”. Infine, se c’è ambiguità tra due metodi disegneremo un arco tratteggiato.
La firma più specifica sarà quella che avrà tutti gli archi uscenti verso gli altri nodi, se non esiste nessun nodo di questo tipo avremo un errore di compilazione.

Indice Lezione PrecedenteLezione Successiva

Pubblicato in Guide, Java, Programmazione Taggato con: , , , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*