Privato e finale?

D: Dato che:

  • private i metodi non possono essere sovrascritti dalle sottoclassi
  • final i metodi non possono essere sovrascritti dalle sottoclassi
  • final i metodi consentono un codice più veloce se compilato con le ottimizzazioni attive (javac -O)

Le mie domande sono:

  1. Perché non dichiarare anche tutti i privatemetodi final?
  2. La maggior parte dei compilatori tratta i privatemetodi come final?

R: Come hai sottolineato, le sottoclassi potrebbero non sovrascrivere i privatemetodi in base alla progettazione. Inoltre, la finalparola chiave dice al compilatore che le sottoclassi non possono sovrascrivere un metodo indipendentemente dal suo livello di accesso. Poiché privategià implica che una sottoclasse non può sovrascrivere un metodo, dichiarare che un privatemetodo finalè ridondante. Fare la dichiarazione non causerà problemi, ma non porterà a termine nulla, poiché le privates vengono considerate automaticamente final.

Ebbene, la pratica di dichiarare tutti i privatemetodi finalavrà un effetto collaterale. Qualsiasi programmatore Java alle prime armi che incontra il tuo codice assimilerà il tuo utilizzo private final, pensando che privatedeve essere dichiarato in quel modo. Quindi, sarai in grado di giudicare chi ha e chi non è stato in contatto con il tuo codice. Potrebbe rivelarsi un esercizio interessante.

Quindi, per rispondere alla domanda 1, non è necessario dichiarare privatemembri final.

Per quanto riguarda la domanda 2, un compilatore ottimizzato e una JVM possono trarre vantaggio da privatemetodi e finalmetodi. Poiché le sottoclassi non possono sovrascrivere questi tipi, non è necessario eseguire l'associazione dinamica in fase di esecuzione. Le sottoclassi non sovrascriveranno mai il metodo, quindi il runtime saprà sempre quale metodo chiamare senza cercare nella gerarchia di ereditarietà. Durante la compilazione, un compilatore ottimizzato può anche scegliere di incorporare tutti i metodi privatee finalper migliorare le prestazioni.

Quindi, per rispondere alla domanda 2, sì, tutti i compilatori tratteranno i privatemetodi come file final. Il compilatore non consentirà l' privateoverride di alcun metodo. Allo stesso modo, tutti i compilatori impediranno alle sottoclassi di sovrascrivere i finalmetodi.

Una domanda più interessante: tutti i compilatori ottimizzeranno finals e privates in modo che siano in linea? La risposta breve è no. Il comportamento di ottimizzazione dipenderà dal compilatore e dalle sue impostazioni.

Nota: la nostra discussione sulla finale privata si applica solo ai metodi. Le variabili del membro finale privato vengono trattate in modo diverso

Ulteriori informazioni su questo argomento

  • Voglio di più? Vedere l' indice di domande e risposte Java per il catalogo completo di domande e risposte

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

Questa storia, "Privata e finale?" è stato originariamente pubblicato da JavaWorld.