2016-07-01 7 views
1

In swift wird empfohlen, eine Variable mit dem Schlüsselwort let zu deklarieren, wenn sich die Variable nach der Initialisierung nicht ändert. Ich sehe viele Variablen als let deklariert.Warum wird Java-Variable nicht häufiger als "final" deklariert? Vergleichen, um das Schlüsselwort in swift zu lassen

In Java glaube ich, das Schlüsselwort final kann den gleichen Zweck dienen. Aber von meiner begrenzten Erfahrung sehe ich nur Leute, die Variablen in seltenen Umständen, z. PI.

Warum wird die Java-Variable nicht häufiger als final deklariert? Gibt es etwas, das mir fehlt?

+5

Weil es extra Eingabe ist und Programmierer sind faul. Aber wenn Sie eine IDE verwenden, hat sie wahrscheinlich eine Funktion, um "wenn möglich" endgültig hinzuzufügen, wenn Sie die Datei speichern. – Thilo

+1

Weil die Leute faul sind. 'final' ist für Sperrungen erforderlich, wird aber selten benutzt. Ich und Robert Simmons Jr. (http://shop.oreilly.com/product/9780596005689.do) befürworten eine größere Akzeptanz.Der Hauptgrund ist, dass es einige blöde Tippfehler zur Kompilierzeit ausfiltert. Da es jedoch keine Auswirkungen auf die Programmlaufzeit hat, gibt es im Gegensatz zu "const" in C++ kein stark genug (für viele Leute) Argument für das zusätzliche Tipp- und Code-Rauschen. –

+0

@Thilo so wie Keyword in Swift lassen, sollte ich eine Java Variable endgültig wo immer möglich deklarieren? – Thor

Antwort

5

siehe In Java, should I use “final” for parameters and locals even when I don't have to?

Grundsätzlich für Felder, ist es sinnvoll und ändert sich auch ihre Gleichzeitigkeit Eigenschaften. siehe Java concurrency: is final field (initialized in constructor) thread-safe?

Für lokale Variablen und Parameter ist der Wert von final jedoch weniger klar. Es hat einigen semantischen Wert, aber auf der anderen Seite kann es auch Lärm

public void foo (final int x, final int y){ 
    try{ 
     final int z = x+y; 
    } 
    catch (final Exception z){ 
     final String message = ""; 
     throw new RuntimeException(message); 
    } 
} 

im Vergleich zu

public void foo (int x, int y){ 
    try{ 
     int z = x+y; 
    } 
    catch (Exception z){ 
     String message = ""; 
     throw new RuntimeException(message); 
    } 
} 

zu haben, wenn Sie kurze Methoden haben (was Sie in der Regel haben sollen), dann Es ist offensichtlich, dass die Variablen nicht geändert werden.

Daher bevorzugen einige Entwickler die Verwendung von final für seinen semantischen Wert, während andere es aufgrund seiner Ausführlichkeit bevorzugen, es nicht zu verwenden.

+0

"während andere es wegen seiner Ausführlichkeit lieber nicht verwenden". Für viele Leute gilt das für Java als Ganzes :-) – Thilo

+0

@Thilo: Tja, aber da Java schon ziemlich ausführlich ist, muss man es nicht noch ausführlicher machen, wenn es nicht nötig ist :) – user140547

3

Java folgt dem traditionellen C-Denkstil, wo wenn wir etwas erstellen (Primitive Typen oder Objekte) ist es standardmäßig eine Variable und Sie müssen setzen "final" in Java und "const" in C/C++ zu machen es ist eine Konstante. Swift ist im Vergleich zu diesen Sprachen sehr neu und seine Ziele sind sichere Programmiermuster und Einfachheit. Wenn Sie weitere Erfahrung in Java sammeln, werden Sie sicher sein, dass die End- und Best Practices häufiger verwendet werden. Der Hauptgrund, warum ich denke (wie Sie bereits erwähnt haben), ist, dass Sie Java nur begrenzt zur Verfügung haben.

2

Initialisieren Sie eine Variable mit final in Java erlauben Compiler stellt sicher, dass Sie es nur einmal initialisieren können. Wenn es sich um einen primitiven Typ wie int oder doubles handelt, kann sichergestellt werden, dass sich der Wert nicht ändern kann. Bei Object, final handelt es sich jedoch nur um die Referenz selbst und nicht um den Inhalt des referenzierten Objekts. Es gibt keine Garantie dafür, dass die Werte innerhalb des Objekts gleich bleiben.

Zum Beispiel kann ich eine Liste mit abschließender wie folgt definieren:

final List<String> foo = new ArrayList<String>(); 

Die oben Listfoo kann nicht erneut initialisiert werden, aber ihr Inhalt verändert werden kann, das heißt es nicht foo unveränderlich macht. Daher machen final Keyword weniger nützlich.

final Das Schlüsselwort hat seinen Platz in der Deklaration eines konstanten Werts, insbesondere wenn nur eine Instanz in einer Klasse mit einem Schlüsselwort static benötigt wird.Es folgt ein Beispiel in java.util.Random.Math:

public final class Math { 

    public static final double PI = 3.14159265358979323846; 
2

Warum ist nicht Java-Variable als final deklariert öfter? Gibt es etwas, das mir fehlt?

Was Sie vermissen ist "menschliche Natur".

Einfach, die Syntax von Java macht es einfacher, die final NICHT hinzuzufügen. Und im Allgemeinen Leute nicht, weil es einfacher ist, nicht zu sein.

Beachten Sie, dass die Design-Entscheidung "Variablen sind nicht endgültig" Design stammt aus Java-Abstammung.


Natürlich ist dies nicht die implizite Frage befassen, ob Java-Programmierer final häufiger verwenden sollte. Aber das ist eine Frage der Meinung, und StackOverflow rät meinungsorientiert Q & A's.

1 - .... in Kontexten, in denen es angebracht wäre. Die Verwendung von final, bei der eine Variable eindeutig änderbar sein muss, ist kontraproduktiv.

+0

Das gilt auch für Klassen und Methoden, von denen einige sagen, dass sie "final" sein sollten. – shmosel

+0

Ja ... obwohl es ein anderes Problem ist. Da haben Sie es mit dem Problem des Abstraktionsbruchs aufgrund von Vererbung zu tun. –

+0

@smoselos Sie sollten die Methoden 'final' deklarieren, wo es möglich ist (solange Sie sie nicht überschreiben). Ansonsten sind sie standardmäßig virtuell und es gibt Leistungseinbußen. –

1

Ich denke, das liegt daran, dass es in Java keine solche "Tradition" gibt.

Sie sehen, das erste Buch über Swift (The Swift Programming Language 2.0 von Apple Inc.) sagt, dass jede Variable, die Sie erstellen, die nicht mutiert ist, sollte als let Konstante deklariert werden.

Seit The Swift Programming Language 2.0 (das Buch) der offizielle Leitfaden für Swift ist, folgt fast jeder ihm. Selbst wenn die Leute dieses Buch nicht lesen, werden sie Tutorials lesen, die von Leuten geschrieben wurden, die dieses Buch gelesen haben. Als Ergebnis ist jeder Codierungsstil so.

Im Gegensatz dazu betont das erste Buch über Java (Programmierung mit Java for Dummies) nicht, dass wir final verwenden sollten, wenn sich der Wert nicht ändert. Und die offiziellen Dokumente tun das selten auch. Daher folgen nur wenige Programmierer dieser Regel. Dies führte dazu, dass die Mehrheit Code schreibt, der dieser Regel tatsächlich folgt.

Außerdem müssen Sie 5 weitere Zeichen (das Wort "final" plus ein Leerzeichen) schreiben, um eine Konstante in Java zu deklarieren, während Sie in Swift keine zusätzlichen Zeichen schreiben (var und lasst das Gleiche) Anzahl von Charakteren)! Programmierer sind faul, weißt du?

1

Zumindest basierend auf meiner Erfahrung, wird mir empfohlen, final zu verwenden, wenn sich die Variable nach der Initiierung nicht ändert. Für den primitiven Typ behandelt JVM sie als Konstante und führt einige Optimierungen durch.

Andere Gelegenheiten wie, in Java, alle Methoden sind standardmäßig virtuell, sofern nicht final deklariert. Es wird auch Rechenleistung erhalten.

Verwandte Themen