2009-12-31 16 views
47

È utile rendere definitivi i metodi privati? Migliorerebbe le prestazioni?Rendi definitivi i metodi privati?

Penso che "private final" non abbia molto senso, perché un metodo privato non può essere ignorato. Quindi la ricerca del metodo dovrebbe essere efficiente come quando si usa il finale.

E sarebbe meglio rendere statico un metodo di supporto privato (quando possibile)?

Che cosa è la migliore da usare?

private Result doSomething() 
    private final Result doSomething() 
    private static Result doSomething() 
    private static final Result doSomething() 
+0

I metodi privati ​​non sono ereditati e quindi non possono essere sostituiti. Una sottoclasse può contenere un metodo con lo stesso nome di un metodo privato finale nella superclasse. Pertanto, non ha intenzione di dichiarare un metodo come finale privato. – CKing

risposta

65

L'aggiunta di final ai metodi non migliora le prestazioni con Sun HotSpot. Dove è possibile aggiungere final, HotSpot noterà che il metodo non viene mai sovrascritto e quindi lo tratta allo stesso modo.

In Java private i metodi non sono virtuali. Non è possibile sovrascriverli, anche utilizzando classi nidificate in cui potrebbero essere accessibili alle sottoclassi. Ad esempio, i metodi per chiamare i privati ​​sono diversi da quelli usati per i non-privati. L'aggiunta di final a metodi privati ​​non comporta alcuna probabilità.

Come sempre, questo tipo di micro-ottimizzazioni non vale la pena trascorrere del tempo.

+0

... nel 99,9% del tempo. E saprai quando le micro-ottimizzazioni hanno senso. Ancora più importante, le dichiarazioni di metodo 'private final' non hanno senso semanticamente, quindi aggiungono solo confusione laddove non ce n'erano; solo "privato" dovrebbe essere sufficiente. –

8

No. Non lo farà. i metodi privati ​​non sono ereditati. Quindi renderli definitivi è un punto controverso. Si noti inoltre che non si dovrebbero rendere i metodi definitivi per le prestazioni. JVM è più intelligente di così. Questo tipo di ottimizzazione non è molto utile. Dovresti rendere le cose definitive, private, private, protette, private, ecc. Basate sulla semantica e sul design.

21

private static Result doSomething(), se questo metodo non utilizza alcuna variabile di istanza. In ogni caso renderli definitivi non ha senso poiché l'accessor è privato.

7

Contrassegnare un metodo privato come finale non cambia nulla ma potrebbe confondere gli sviluppatori junior che guardano il tuo codice. Mantienilo semplice.

4

L'IBM Developer funziona: Java theory and practice: Is that your final answer? articolo è un vecchietto ma goodie sull'utilizzo della parola chiave final in Java:

+0

Man Desidero che C# abbia una parola chiave finale. Invece è const, readonly e sealed. bleh. –

0

Rendendo ultimo metodo non possiamo ignorare il metodo. Dal momento che i metodi privati ​​non sono accessibili al di fuori della classe. Non c'è senso di rendere il metodo definitivo e privato. Potrebbe colpire la performance.

+1

Non colpirà la performance, i compilatori sono più intelligenti di questo –

Problemi correlati