fa il compilatore a trattare tutti i metodi di una classe finale in quanto definitiva se stessi?
In effetti sì. Non è possibile sovrascrivere un metodo in una classe final
. L'aggiunta (o la rimozione) di una parola chiave final
a un metodo non fa differenza con questa regola.
L'aggiunta della parola chiave finale ai metodi in una classe finale ha qualche effetto?
In pratica, ha un effetto minimo. Non ha alcun effetto sulle regole di overriding (vedi sopra), e nessun effetto sulla inlining (vedi sotto).
E 'possibile dire in fase di esecuzione se un metodo è stato dichiarato con una parola chiave final
... utilizzando la riflessione per osservare i flag del metodo. Quindi ha un effetto un po ', anche se un effetto che è irrilevante per il 99,99% dei programmi.
Ho capito che i metodi finali hanno una migliore possibilità di essere in linea e questo è il motivo per cui lo chiedo.
Questa comprensione è errata.Il compilatore JIT in una JVM moderna tiene traccia di quali metodi non sono sovrascritti nelle classi caricate da da un'applicazione. Utilizza queste informazioni e i tipi statici per determinare se una determinata chiamata richiede o meno l'invio di classi virtuali. In caso contrario, è possibile eseguire l'inlining e verrà utilizzato a seconda della dimensione del corpo del metodo. In effetti, il compilatore JIT ignora la presenza/assenza di final
e utilizza un metodo più accurato per rilevare le chiamate ai metodi in cui è consentita l'inclusione del metodo.
(in realtà è più complessa. Un'applicazione può caricare dinamicamente sottoclassi che causano analisi metodo di sostituzione del compilatore JIT diventare non corretto. In questo caso, la JVM deve invalidare qualsiasi metodo compilati effettuate e causare loro di essere . ricompilato)
La conclusione è:
v'è alcun vantaggio prestazioni in aggiunta ai metodi final
in final
classi.
- Ci
potrebbe essere un vantaggio prestazionale in final
a metodi non final
classi, ma solo se si sta utilizzando un vecchio Sun JVM, o qualche altra piattaforma Java/Java-like con una scarsa qualità del compilatore JIT.
Se vi preoccupate per le prestazioni, è meglio utilizzare una piattaforma Java up-to-date/alte prestazioni con un compilatore JIT decente rispetto ad inquinare il codice-base con final
parole chiave che sono suscettibili di causare problemi in futuro.
Hai scritto in un commento:
@RussellZahniser Ho letto in modo diverso in molti luoghi.
Internet è pieno di vecchie informazioni, molte delle quali non aggiornate ... o non è mai stato corretto in primo luogo.
Per essere pedante, è discutibile se i metodi siano implicitamente definitivi o meno; non c'è alcuna possibilità di tentare di scavalcarli! –
Ciò significa che il compilatore tratterà questi metodi come finali? (inlining) @OliCharlesworth True, ma c'è una differenza nel modo in cui il compilatore tratta i metodi virtuali e finali. – Acidic
@Acidic: vedere il terzo link che ho appena aggiunto. Probabilmente non hai bisogno di uscire dal tuo modo di dichiarare le cose come definitive. Ma sì, per il compilatore, quei metodi sono considerati "finali". – EboMike