Programovanie

Súkromné ​​a konečné?

Otázka: Vzhľadom na to, že:

  • súkromné metódy nemôžu byť prepísané podtriedami
  • konečné metódy nemôžu byť prepísané podtriedami
  • konečné metódy umožňujú rýchlejší kód pri kompilácii s optimalizáciami na (javac -O)

Moje otázky sú:

  1. Prečo nevyhlásiť všetky súkromné metódy konečné tiež?
  2. Spravuje to väčšina prekladačov súkromné metódy ako konečné?

A: Ako zdôrazňujete, podtriedy nemusia mať prednosť súkromné metódy podľa návrhu. Ďalej konečné kľúčové slovo hovorí kompilátoru, že podtriedy nemôžu prepísať metódu bez ohľadu na jej úroveň prístupu. Odkedy súkromné už znamená, že podtrieda nemusí prepísať metódu, vyhlásením a súkromné metóda byť konečné je nadbytočný. Urobenie vyhlásenia nebude robiť problémy, ale odvtedy tiež nič nedosiahne súkromnésa automaticky zohľadňujú konečné.

Nuž, prax deklarovania všetkých súkromné metódy konečné bude mať jeden vedľajší účinok. Každý začínajúci programátor Java, ktorý sa stretne s vašim kódom, asimiluje vaše použitie súkromné ​​finálemysliac si to súkromnés musí byť deklarovaná týmto spôsobom. Budete teda môcť posúdiť, kto má a kto nebol v kontakte s vašim kódom. Mohlo by sa to ukázať ako zaujímavé cvičenie.

Na zodpovedanie otázky 1 teda nie je potrebné vyhlásiť súkromné členov konečné.

Pokiaľ ide o otázku 2, optimalizačný kompilátor a JVM môžu využiť výhody súkromné metódy a konečné metódy. Pretože podtriedy nemusia tieto typy prepísať, nie je potrebné robiť dynamické väzby za behu. Podtriedy metódu nikdy neprepíšu, takže modul runtime bude vždy vedieť, ktorú metódu má volať, bez toho, aby prehľadal hierarchiu dedičstva. Počas kompilácie sa môže optimalizujúci kompilátor dokonca rozhodnúť vložiť všetky súkromné a konečné metódy na zlepšenie výkonu.

Takže, aby som odpovedal na otázku 2, áno, všetci kompilátori zaobchádzajú súkromné metódy ako konečné. Kompilátor nepovolí žiadne súkromné spôsob, ktorý má byť prepísaný. Rovnako všetky kompilátory zabránia prepísaniu podtried konečné metódy.

Zaujímavejšia otázka: Optimalizujú sa všetky kompilátory konečnés a súkromnétak, aby boli vložené? Krátka odpoveď je nie. Optimalizačné správanie bude závisieť od prekladača a jeho nastavení.

Poznámka: Naša diskusia o súkromnom finále sa týka iba metód. S premennými súkromných konečných členov sa zaobchádza odlišne

Získajte viac informácií o tejto téme

  • Chcieť viac? Viď Java Q&A Register pre celý katalóg otázok a odpovedí

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

Tento príbeh „Súkromný a konečný?“ pôvodne vyšla vo vydavateľstve JavaWorld.

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