Quando dovrei usare "finale"?

C'è qualche ragione particolare per cui dovrei dichiarare una class o un metodo finale nella programmazione giornaliera (web o altro)? Si prega di fornire un esempio del mondo reale in cui dovrebbe essere utilizzato.

A proposito, sto chiedendo perché sto cercando di scegliere una parola chiave "oscura" e controllarla .

Impedisce ad altri programmatori di fare cose con le tue classi che non hai intenzione di fare. Quindi, anziché fare un commento che dice "non usare questa class per fare XXX", puoi progettarlo in modo tale da non essere tentato di sovrascriverlo e abusarne in quel modo.

Modifica : poiché viene richiesto un esempio, descriverò un caso in cui potresti trovare utile questa parola chiave … diciamo che hai una class che definisce come due oggetti possono comunicare tra loro, ad esempio un listener e un notificatore. La class listener deve ovviamente consentire l'ereditarietà, ma è ansible che si desideri rendere la class notifier final in modo che debba essere utilizzata in una relazione "has-a". In questo modo, puoi formulare alcune assunzioni dagli oggetti listener sulla natura dei messaggi che stanno ricevendo.

Altrimenti, sarebbe ansible ereditare da quella class, fare each sorta di cose pazze come estendere i messaggi e così via. Se non vuoi che altri programmatori lo facciano, allora potresti fare la finale della class. Inoltre, questo potrebbe avere molto più senso in un'API pubblica ampiamente utilizzata, in quanto consente anche ad altri programmatori di capire facilmente quali classi sono accettabili per la sottoclass.

Un altro esempio: si supponga di avere un processre di stream basato su buffer e all'interno del metodo read () / write (), si mantengono alcuni dati sullo stato corrente dell'object (cioè il byte corrente o qualsiasi altra cosa). Non c'è modo di garantire che chiunque sottoclassi questa class chiami i methods del super durante l'elaborazione – e dal momento che una tale class probabilmente contiene solo alcuni methods, è meglio semplicemente rendere l'intera cosa definitiva invece di each metodo. Questo di nuovo costringe le persone ad usare la class "ha-a", non "è-a", e quindi, può controllare come ci si aspetta che il codice venga eseguito.

Sono d'accordo con te sul fatto che fare un'intera class final è probabilmente qualcosa che avresti bisogno di fare una volta in una luna blu, ma è bello che PHP abbia questa capacità nel caso tu decidessi di esercitarla.

"Enforce Composition over Ereditance" lo esprime in modo piuttosto succinto. Garantisci un determinato comportmento della tua class che nient'altro può interferire, il che, come spiega la prossima sezione, può avere anche vantaggi di sicurezza.

Alcune persone sostengono che dovresti dichiarare tutte le classi finali a less che tu non intenda specificamente consentire, e ne abbia esaminato le implicazioni, un'estensione polimorfa di esso. Tendo a capire che questo implica molta sfiducia nei confronti di chiunque altro stia lavorando con il tuo codice, ma sfortunatamente, a volte ciò è giustificato.

In molti linguaggi, dichiarare una class come definitiva fornisce anche vantaggi di ottimizzazione, dal momento che non è necessario guardare alla tabella dei methods.

Se vuoi far rispettare l'intento della class, e l'intento è tale che non ha senso sottoclass, quindi usa finale; altrimenti, non c'è alcun vantaggio significativo.

In generale, è solo un meccanismo per rafforzare l'intento.

Una class finale è una class che non può essere sottoclassificata, quindi tutto ciò di cui non si desidera creare derivati. Ad esempio in Java, la class Math è definitiva poiché Java non vuole che tu sia in grado di ridefinire il significato del valore assoluto.

finale (e sigillato in c #) potrebbe essere usato (dai progettisti di librerie di classi) per far rispettare alcuni comportmenti di base di una class.
Ad esempio, imporre che la string abbia un comportmento immutabile
La class string in java è contrassegnata come finale e in c # è contrassegnata come sigillata.
Tutte le stringhe sono immutabili e questo comportmento non può essere modificato.