JavaRush /Java Blog /Random-IT /metodi e classi Java finali
articles
Livello 15

metodi e classi Java finali

Pubblicato nel gruppo Random-IT
Denotando un metodo di classe con un modificatore final, intendiamo che nessuna classe derivata è in grado di sovrascrivere questo metodo modificando la sua implementazione interna. In altre parole, stiamo parlando della versione finale del metodo. La classe nel suo insieme può anche essere contrassegnata come final. metodi e classi Java finali - 1
final class NoExtending {
// …
}
Una classe contrassegnata come finalnon può essere ereditata e tutti i suoi metodi acquisiscono indirettamente la proprietà final. L'utilizzo della funzionalità finala nelle dichiarazioni di classi e metodi può aumentare il livello di sicurezza del codice. Se una classe è dotata di un modificatore final, nessuno può estendere la classe e probabilmente romperne il contratto nel processo. Se un segno finaldenota un metodo, puoi fidarti completamente della sua implementazione interna in tutte le situazioni senza timore di "falsificazione". È opportuno utilizzare final, ad esempio, nella dichiarazione di un metodo che richiede la verifica della password inserita dall'utente per garantire l'esatta esecuzione di quanto previsto dal metodo originariamente. Un possibile utente malintenzionato non sarà in grado di modificare l'implementazione originale di tale metodo "inserendo" nel programma una sua versione sovrascritta, che, ad esempio, restituisce sempre il valore true, indicando la corretta registrazione dell'utente, indipendentemente dalla password è effettivamente entrato. Hai il diritto, se la situazione specifica lo consente, di andare oltre e dichiarare finall'intera classe come classe; il metodo ValidatePasswordacquisirà indirettamente la stessa proprietà. L'uso di un modificatore finalin una dichiarazione di metodo o di classe impone serie restrizioni alla possibilità di ulteriore utilizzo e sviluppo del codice. L'uso di finalun metodo in una dichiarazione è un indicatore sicuro che l'implementazione del metodo è autonoma e completamente completa. Altri programmatori che vorranno utilizzare la tua classe, espandendone le funzioni in base alle proprie esigenze, saranno limitati nella scelta dei mezzi per raggiungere il proprio obiettivo o ne saranno completamente privati. Contrassegnando finaluna classe nel suo insieme, ne disabiliterai la possibilità di essere ereditata e probabilmente ne ridurrai significativamente l'utilità per gli altri. Quando stai per utilizzare il modificatore final, assicurati se TU sei pronto per tali sacrifici e se vale la pena farli. In molti casi, per ottenere un livello sufficiente di sicurezza del codice, non è necessario designare l'intera classe come final: è del tutto possibile preservare l'estensibilità della classe contrassegnando finalsolo i suoi elementi strutturali "critici" con un modificatore. In questo caso lascerete intatte le funzioni principali della classe e allo stesso tempo ne consentirete l’ereditarietà con l’aggiunta di nuovi membri, ma senza ridefinire quelli “vecchi”. Naturalmente, i campi a cui accede il codice dei metodi devono a loro finalvolta essere designati come , altrimenti qualsiasi classe derivata potrà modificarne il contenuto, influenzando il comportamento dei metodi corrispondenti. Un altro effetto dell'utilizzo di un modificatore è legato alla semplificazione del problema di ottimizzazione del codice risolto dal compilatore. Questo è ciò che accade quando viene chiamato un metodo che non è contrassegnato comefinalprivatefinalfinal, il sistema runtime determina la classe effettiva dell'oggetto, associa la chiamata al codice più appropriato dal gruppo di metodi sovraccaricati e trasferisce il controllo a quel codice. Ma se, ad esempio, il metodo getNamenell'esempio di classe Attrdiscusso in precedenza fosse stato designato come final, l'operazione di chiamata sarebbe stata notevolmente semplificata. Nel caso più banale, come quello riguardante getName, il compilatore può semplicemente sostituire la chiamata al metodo con il suo body code. Questo meccanismo è chiamato incorporamento del codice (inlining). Quando si utilizza la versione inline del metodo, getNamele due espressioni seguenti vengono eseguite esattamente allo stesso modo:
system.out.println("id = " + rose.name);
system.out.println("id = " + rose.getName());
Sebbene le espressioni precedenti siano equivalenti, la seconda ha comunque un vantaggio, poiché il metodo getNameconsente di dare al campo nome una proprietà di sola lettura e al codice della classe di avere un certo grado di astrazione, che consente di modificare più liberamente l'espressione implementazione della classe. Lo stesso schema di ottimizzazione può essere applicato dal compilatore ai metodi privatee statiс, poiché anch'essi non consentono l'override. L'uso di un modificatore finalnelle dichiarazioni di classe rende inoltre più efficienti alcune operazioni di controllo del tipo. In questo caso molte di queste operazioni possono essere eseguite già in fase di compilazione e quindi eventuali errori vengono rilevati molto prima. Se il compilatore incontra un riferimento a una classe nel testo sorgente final, può essere "sicuro" che l'oggetto corrispondente sia del tipo specificato. Il compilatore è in grado di determinare immediatamente il posto occupato da una classe nella gerarchia complessiva delle classi e verificare se viene utilizzata correttamente o meno. Se il modificatore finalnon viene applicato, i relativi controlli vengono effettuati solo in fase di esecuzione del programma. Esercizio 3.4. È consigliabile includere il modificatore finale nelle dichiarazioni di metodo (e se sì, quali) delle classi veicolo e veicolo passeggeri ? Collegamento alla fonte originale: http://src-code.net/metody-i-klassy-final-java
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION