2013-02-01 7 views
6

Mögliche Duplizieren:
Java final modifierDer richtige Einsatz von final

Dies ist nur eine kleine Frage über Vorlieben. Was wäre die korrekte Verwendung für den endgültigen Modifikator?

Ich habe festgestellt, dass von Quelle zu Quelle gehen, dass ich dazu tendiere, es mehr als andere zu verwenden. Ich stelle es für die Parameter für eine Methode, für Variablen in der Methode und was auch immer ich kann. Ist das notwendig oder übertreibe ich es gerade?

Referenz:

private final int x; 
private final int y; 
private final int id; 
private final int width; 
private final int height; 

public Widget(final int id, final int x, final int y, final int width, final int height) { 
    this.id = id; 
    this.x = x; 
    this.y = y; 
    this.xmod = x; 
    this.ymod = y; 
    this.width = width; 
    this.height = height; 
} 
+4

[Java final modifier] (http://stackoverflow.com/questions/4012167/java-final-modifier) ​​ – Smit

+0

Können Sie einige Beispiele teilen? –

+0

Ich denke, du solltest "final" nur verwenden, wenn es notwendig ist. Wie alles solltest du es nicht missbrauchen. –

Antwort

5

Ja, Sie es übertreiben. In der Vergangenheit könnte dies zu einigen Optimierungen geführt haben - z. Die finalen Methoden können leichter inline ausgeführt werden - heutzutage werden die meisten dieser Optimierungen durchgeführt, unabhängig davon, ob Sie die Methode final kennzeichnen oder nicht.

Die Orte, die Sie noch final verwenden sollten, sind die meisten Felder in Klassen, Klassen, die nicht erweitert werden sollen oder nicht, für Methoden, die Sie nicht überschreiben möchten, und für lokale Variablen, die abgerufen werden müssen referenziert in anonymen inneren Klassen.

Insbesondere ist es zu viel Aufwand, es auf lokale Variablen und Methodenparameter zu tun, die nicht in anonyme innere Klassen verpackt werden.

+2

+1 Ich stimme zu, dass eine Übernutzung zu Unordnung führt, insbesondere bei Methodenparametern und lokalen Variablen. Auch "final" hat im Allgemeinen keine Auswirkungen auf die Laufzeit http://www.ibm.com/developerworks/java/library/j-jtp1029/index.html –

+0

Würde sich der Downvoter darum kümmern? –

+1

Jemand mag wahrscheinlich letzte Unordnung. Ich kenne Leute, die alle Variablen auf den Punkt bringen. –

2

Ich würde sagen, dass alle Felder, Klasse oder Methode, die nie immer endgültig geändert oder außer Kraft gesetzt werden soll. Dies macht es threadsicher und ermöglicht dem Compiler und vm, Optimierungen vorzunehmen. Es verdeutlicht auch Ihre Absicht als Programmierer und sagt anderen Entwicklern, dass sich der Wert niemals ändert, wenn sie nach Komplexität suchen, die sie woanders suchen können.

Guter Artikel hier: http://www.javapractices.com/topic/TopicAction.do?Id=23

1

Ich würde sagen, dass Sie „endgültig“, wenn Sie nicht wollen, eine Variable geändert werden, nachdem sie initialisiert wurde verwenden sollten, oder wenn Sie werden keine Klasse wollen subclassed oder eine Methode, die überschrieben werden soll, aber Unterklassen. Compiler-Optimierung in Bezug auf, dachte ich, dass die Verwendung von „final“ Stichwort in irgendeine Weise helfen würde, aber ich habe gerade gelesen das:

Ein verbreiteter Irrtum ist, dass eine Klasse oder Methode endgültig erklärt Effizienz verbessert durch den Compiler ermöglicht um die Methode direkt inline einzufügen, wo immer sie aufgerufen wird. Tatsächlich kann der Compiler dies nicht tun, weil die Methode zur Laufzeit geladen wird und nicht die gleiche Version wie die, die gerade kompiliert wurde. Nur die Laufzeit Umgebung und JIT-Compiler haben die Informationen über genau welche Klassen geladen wurden, und sind in der Lage, bessere Entscheidungen über wenn Inline, ob die Methode endgültig ist oder nicht.

http://en.wikipedia.org/wiki/Final_(Java)

0

Es ist nicht notwendig, Variablen jedes Mal endgültig zu machen. Es kann zu Kopfschmerzen führen, wenn Sie den Wert solcher Variablen ändern möchten.

Ich denke, du solltest eine Variable final nur dann abzeichnen, wenn sie konstant ist oder wenn du denkst, dass sie nicht geändert werden sollte.

1

Wenn Java heute entworfen wird, sind alle lokalen Variablen und Methodenparameter standardmäßig endgültig.

Leider, da die Sprache das nicht tut, sollten wir das stattdessen manuell tun?

Es scheint einfach zu viel Mühe. Wenn wir es nicht tun, und es scheint kein großes Problem zu geben, dann können wir faul sein und tun es nicht.

Verwandte Themen