Il codice è sempre dati! Le istruzioni bytecode per un programma sono memorizzate. Il programmatore non ha accesso diretto in lettura e scrittura a questa memoria, ma è lì.
Quando parliamo di "trattare" il codice come dati, ci riferiamo alla memorizzazione di riferimenti a quella memoria in un modo che possa essere utilizzato e organizzato nel modo in cui solitamente pensiamo ai "dati".
Per esempio, si potrebbe immaginare che dentro button
sembra qualcosa di simile:
class Button {
private ActionListener[] listeners = new ActionListener[100];
private int count = 0;
public void addActionListener(ActionListener listener) {
listeners[count] = listener;
++count;
}
// called somehow when the button is clicked
void notifyListeners() {
ActionEvent theEvent = new ActionEvent(...);
for(int i = 0; i < count; ++i) {
listeners[i].actionPerformed(theEvent);
}
}
}
Essenzialmente Button
è mantenere un elenco di funzioni in un array: questo è trattare il codice come dati. Nella maggior parte dei casi uno ActionListener
non ha altro scopo se non quello di fare riferimento a un particolare override di actionPerformed
.
Poiché tutti i metodi di istanza Java sono virtuali, possiamo sempre considerare il codice come dati. Ciò è dimostrato dall'elaborato framework di ascolto degli eventi di AWT/Swing. Le espressioni lambda aggiungono solo enfasi concettuale e breve sintassi. (Anche un aumento di prestazioni nella maggior parte delle situazioni a causa della loro implementazione.)
Lambdas ci consente di esprimere più chiaramente il nostro intento quando utilizziamo un oggetto solo per implementare un metodo particolare, non per memorizzare valori.
Tecnicamente parlando, tutto avviene tramite indirezione. Un ActionListener
non contiene il codice: invece, la macchina virtuale sa in qualche modo (che non siamo a conoscenza) che punta a una particolare struttura in memoria che contiene un puntatore al codice. Quindi una sorta di riferimento al codice è ciò che viene effettivamente passato in giro, quindi "tratta il codice come dati".
Immagino che si riferisca al passaggio di un metodo come valore, che lambda da l'illusione di fare. I valori sono visti come dati e "codice" si riferisce probabilmente al blocco di codice che è il metodo –
Sembra un linguaggio funzionale che tratta le funzioni come _prime class citizens_ (il concetto di dare una funzione come input per un'altra funzione). Questo esempio mi sembra abbastanza disordinato, altri linguaggi funzionali o ibridi-funzionali fanno un lavoro migliore con la sintassi, per esempio controlla Scala (che è ancora basato sulla JVM). – Marcs
"Il codice come dati" è uno slogan che non significa nulla che non sapessi già. – immibis