Programmering

Privat og endelig?

Spørsmål: Gitt at:

  • privat metoder kan ikke overstyres av underklasser
  • endelig metoder kan ikke overstyres av underklasser
  • endelig metoder muliggjør raskere kode når de kompileres med optimaliseringer på (javac -O)

Mine spørsmål er:

  1. Hvorfor ikke erklære alt privat metoder endelig også?
  2. Behandler de fleste kompilatorer privat metoder som endelig?

EN: Som du påpeker, kan det hende at underklasser ikke overstyres privat metoder etter design. Videre er den endelig nøkkelord forteller kompilatoren at underklasser kanskje ikke overstyrer en metode uavhengig av tilgangsnivå. Siden privat innebærer allerede at en underklasse kanskje ikke overstyrer en metode, og erklærer en privat metode å være endelig er overflødig. Å avgi erklæringen vil ikke føre til problemer, men det vil heller ikke oppnå noe, siden privats blir automatisk vurdert endelig.

Vel, praksisen med å erklære alt privat metoder endelig vil ha en bivirkning. Enhver nybegynner Java-programmerer som møter koden din, vil assimilere bruken av privat finale, tenker det privats må erklæres på den måten. Så du vil kunne bedømme hvem som har og ikke har vært i kontakt med koden din. Det kan vise seg å være en interessant øvelse.

Så, for å svare på spørsmål 1, er det ikke nødvendig å erklære privat medlemmer endelig.

Når det gjelder spørsmål 2, kan en optimaliserende kompilator og JVM dra nytte av privat metoder og endelig metoder. Siden underklasser kanskje ikke overstyrer disse typene, er det ikke nødvendig å utføre dynamisk binding ved kjøretid. Underklasser vil aldri overstyre metoden, så kjøretiden vil alltid vite hvilken metode man skal ringe uten å søke i arvshierarkiet. Under kompilering kan en optimaliserende kompilator til og med velge å integrere alle privat og endelig metoder for å forbedre ytelsen.

Så for å svare på spørsmål 2, ja, vil alle kompilatorer behandle privat metoder som endelig. Kompilatoren tillater ikke noe privat metoden som skal overstyres. På samme måte vil alle kompilatorer forhindre at underklasser overstyres endelig metoder.

Et mer interessant spørsmål: Vil alle kompilatorer optimalisere seg endeligs og privats slik at de er inline? Det korte svaret er nei. Optimaliseringsadferd vil være avhengig av kompilatoren og dens innstillinger.

Merk: Diskusjonen vår om privatfinale gjelder bare metoder. Private endelige medlemsvariabler behandles forskjellig

Lær mer om dette emnet

  • Ønsker mer? Se Java Q&A Indeks for hele Q&A katalogen

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

Denne historien, "Privat og endelig?" ble opprinnelig utgitt av JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found