Programmering

Privat og endelig?

Spørgsmål: I betragtning af at:

  • privat metoder kan ikke tilsidesættes af underklasser
  • endelig metoder kan ikke tilsidesættes af underklasser
  • endelig metoder giver hurtigere kode, når de kompileres med optimeringer på (javac -O)

Mine spørgsmål er:

  1. Hvorfor ikke erklære alt privat metoder endelig såvel?
  2. Behandler de fleste compilere privat metoder som endelig?

EN: Som du påpeger, tilsidesætter underklasser muligvis ikke privat metoder ved design. Desuden er den endelig nøgleord fortæller kompilatoren, at underklasser muligvis ikke tilsidesætter en metode uanset dens adgangsniveau. Siden privat indebærer allerede, at en underklasse muligvis ikke tilsidesætter en metode, der erklærer en privat metode at være endelig er overflødig. At afgive erklæringen vil ikke medføre problemer, men det vil heller ikke udrette noget, da privats overvejes automatisk endelig.

Nå, den praksis at erklære alt privat metoder endelig vil have en bivirkning. Enhver nybegynder Java-programmør, der støder på din kode, vil assimilere din brug af privat finale, tænker det privats skal erklæres på denne måde. Så du vil være i stand til at bedømme, hvem der har og ikke har været i kontakt med din kode. Det kan vise sig at være en interessant øvelse.

Så for at besvare spørgsmål 1 er der ingen grund til at erklære privat medlemmer endelig.

Hvad angår spørgsmål 2 kan en optimeringscompiler og JVM drage fordel af privat metoder og endelig metoder. Da underklasser muligvis ikke tilsidesætter disse typer, er der ikke behov for at udføre dynamisk binding ved kørsel. Underklasser tilsidesætter aldrig metoden, så kørselstiden ved altid, hvilken metode der skal kaldes uden at søge på arvshierarkiet. Under kompilering kan en optimerings kompilator endda vælge at integrere alle privat og endelig metoder til forbedring af ydeevnen.

Så for at besvare spørgsmål 2, ja, vil alle kompilatorer behandle privat metoder som endelig. Compileren tillader ikke nogen privat metode, der skal tilsidesættes. Ligeledes forhindrer alle kompilatorer underklasser i at tilsidesætte endelig metoder.

Et mere interessant spørgsmål: Vil alle kompilatorer optimeres endeligs og privats så de er inline? Det korte svar er nej. Optimeringsadfærd afhænger af compileren og dens indstillinger.

Bemærk: Vores diskussion af privatfinalen gælder kun for metoder. Private endelige medlemsvariabler behandles forskelligt

Lær mere om dette emne

  • Ønsker mere? Se Java Q&A Indeks for det fulde Q&A katalog

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

Denne historie, "Privat og endelig?" blev oprindeligt udgivet af JavaWorld.