Perché non ci sono puntatori a funzioni in Java? [chiuso]

4

Ultimamente ho iniziato a studiare diversi concetti interessanti che esistono in lingue diverse da Java. Poiché l'unico linguaggio con cui ho programmato è Java, molti di questi concetti sono molto nuovi per me. Quindi questa domanda potrebbe essere molto ingenua :).

Ho imparato di recente sulle funzioni di prima classe e sui puntatori di funzioni. Perché non ci sono puntatori a funzioni in Java? O almeno qualche variazione di loro, come i delegati in C #?

Forse è solo l'eccitazione di apprendere questo concetto, ma mi sembra che potrebbe essere una funzionalità potente nella lingua.

    
posta Aviv Cohn 22.05.2014 - 22:03
fonte

2 risposte

4

I puntatori di funzione da soli sono più o meno una soluzione per la mancanza di funzioni di prima classe. Ma Java fa ha funzioni di prima classe a partire da Java 8 (lambdas), ed era stato (un po ') facilmente falsificabile da Java 1.1 (classi interne anonime).

Ma in realtà, Java (o più precisamente il JRE) ha anche un concetto che corrisponde più direttamente ai puntatori di funzione rispetto a lambdas o classi interne anonime: MethodHandle s. È una maniglia per un metodo. Che non è molto diverso da un puntatore a una funzione. Sono stati aggiunti in Java SE 7.

    
risposta data 23.05.2014 - 00:09
fonte
2

Risposta breve: perché Java ha altri modi per realizzare la stessa cosa, e il linguaggio si fa in quattro per nascondere i puntatori dietro riferimenti che non hanno la semantica del puntatore.

Risposta lunga:

Il vantaggio principale di un puntatore a funzione in C o C ++ è che una libreria esterna inserisca funzionalità in fase di esecuzione, poiché una classe non è nota al momento della compilazione. Considera un WidgetFactory in un'applicazione. È estensibile: si può creare una sottoclasse per produrre nuovi tipi di widget. Tuttavia, non è possibile per un'applicazione C ++ creare un PluginWidgetFactory perché non è stato ancora scritto.

Inserisci i puntatori di funzione: dopo aver caricato dinamicamente un file DLL / SO, quella libreria chiamerà una funzione nell'applicazione principale e registrati come fabbrica. Fornirà un puntatore a funzione per dire "chiama questa funzione e restituirò la mia sottoclasse di WidgetFactory di cui il tuo compilatore non sapeva nulla".

In Java, dovresti usare la riflessione. Java WidgetFactory controlla una proprietà di sistema con il nome della classe e carica la PluginWidgetFactory in modo dinamico utilizzando reflection.

Sebbene Java non supporti i puntatori di funzioni, può raggiungere lo stesso obiettivo finale utilizzando meccanismi diversi. I creatori di Java sentivano che questi altri modi erano migliori grazie al loro obiettivo di nascondere i puntatori.

    
risposta data 22.05.2014 - 23:59
fonte

Leggi altre domande sui tag