2012-03-21 12 views
5

Sto usando il plugin checkstyle di eclissi. Ho pochi metodi in una classe A, che sono sovrascritte in classe B. Ho il seguente avviso per la maggior parte dei metodiPerché CheckStyle suggerisce di utilizzare un metodo finale?

La funzione SearchAndReplace non è concepito per essere ereditata
- si deve dichiarare astratta o finale o lasciarlo vuoto.

C'è qualche vantaggio nel dichiarare un metodo come finale?

EDIT

So quello che la parola finale è per. So che impedisce l'override dei metodi, ci sono altri vantaggi, come le prestazioni o qualcosa del genere?

+1

un metodo finale non può essere annullato! – Rakesh

+1

Sono curioso di sapere come il plugin può sapere come è stato concepito il metodo. – EJP

risposta

12

Quando dichiari che un metodo è definitivo, stai dicendo che il metodo non può essere sovrascritto.

Citazione dal linguaggio Java Specification:

Un metodo può essere dichiarato finale per impedire alle sottoclassi di sostituire o di nasconderlo.

È un errore in fase di compilazione per tentare di sovrascrivere o nascondere un metodo finale.

Lo slogan comune (a causa di Joshua Bloch credo) è

                      "Progettazione e documento per eredità o Else vietare"

Quindi, a meno che la tua intenzione non sia quella di consentire alle sottoclassi di ignorare il metodo (e potenzialmente modificare il comportamento o f la super-classe (tutti i metodi sono virtual in Java)) quindi rendere definitivo il metodo.

0

In Java, parola finale è applicata nel ampio contesto:

La parola finale è un modificatore intende la classe finale non può essere estesa, una variabile non può essere modificata, e anche un metodo può essere override

4

Un metodo final garantisce che nessuna sottoclasse sovrascriverà il metodo. Le probabilità sono che il runtime possa trarne vantaggio per un guadagno in termini di prestazioni (che può essere lieve).

Il motivo principale per la creazione di un metodo final consiste nel bloccare gli ereditari che eseguono l'override del metodo. Questa potrebbe essere una considerazione importante (ad esempio, immagina un metodo chiamato bool checkSecurity() - lasciare che altri lo ignorino sarebbe male!)

0

Quando un metodo viene dichiarato come definitivo, può essere richiamato nel costruttore (a meno che non siano altri metodi non definitivi) invocato in esso). Se non è una sottoclasse finale, può sovrascriverla in un modo che tenta di accedere ai campi introdotti nella sottoclasse. E questo spesso non sarà quello che ti aspetti. Penso che ci sia un vantaggio in termini di prestazioni quando si scrive per dispositivi mobili, ma io non sono esperto lì.

Problemi correlati