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.