2017-07-26 6 views
3

Ich betrachte mich selbst als ziemlich erfahren in Java, aber es gibt immer noch ein paar grundlegende Dinge, von denen ich mir nicht wirklich sicher bin.Java: Best Practice für Deklaration und Initialisierung

Ich versuche immer, einen wartbaren, leicht lesbaren Code zu schreiben und auf höchste Effizienz zu zielen. Zum Beispiel nenne ich nur einen "neuen" -Operator nur, wenn es wirklich benötigt wird.

Das ist, weil ich Speicher nicht unnötig reservieren möchte. Aber was ist mit der Unterstützung von Variablen?

Viele Menschen neigen dazu, einen String zu erklären, nur einige lange ass Methode Aufruf wie folgt zuzuordnen:.

String Helfer = Class.method1() method2 (param) .getter();

Ich frage mich immer, ob das nicht mehr Speicher als benötigt. Der Getter gibt ein neues Objekt bereits zurück und jetzt wird noch mehr Speicher zugeordnet, indem zusätzlich darauf verwiesen wird. Wenn ich diesen Getter mehr als einmal verwende, ist eine Hilfsstring praktisch, aber wenn es nur einmal benötigt wird, wäre es nicht besser, diese Methode direkt zu übergeben, anstatt eine neue Variable zu deklarieren? Wird dem Heap tatsächlich Speicher zugewiesen?

Objekt a, b, c, d, e, f, g, h, i, j ...;

Ich hoffe, dass einige erfahrene Java-Jungs mir sagen können, wie sie mit grundlegenden Dingen wie diesem umgehen. Vielen Dank! :)

+1

In Ihrem Beispiel würde auf dem _stack_ mehr Speicher verwendet werden als auf _heap_. Es ist so eine kleine Menge, um die es sich nicht zu kümmern lohnt. Es kommt darauf an, dass Sie mit dem String einen hilfreichen Namen erhalten, damit Ihr Code etwas selbstdokumentierender und damit besser lesbar wird. –

+0

"Der Getter gibt bereits ein neues Objekt zurück ..." - Nein, das ist normalerweise nicht der Fall, wenn es nur einen Verweis auf ein Element des aufgerufenen Objekts zurückgibt, wie es bei den meisten Getter-Methoden der Fall ist. – Jesper

+0

Was eigentlich wichtiger ist, ist das 'Class.method1(). Method2 (param).Getter() 'ist eine eklatante Verletzung des [Demeter] -Gesetzes (https://en.wikipedia.org/wiki/Law_of_Demeter) (das Prinzip des geringsten Wissens), wodurch der Code eng an seine Abhängigkeiten gekoppelt und damit schwieriger wird aufrecht erhalten. –

Antwort

0

Wenn das Mitglied nur über einen Accessor (eine "Setter" -Methode) eingestellt werden kann, bevorzuge ich den ersten Stil. Es gibt einen Hinweis, dass der initialisierte Wert der Standard bei der Konstruktion ist.

Wenn das Mitglied während der Konstruktion angegeben werden kann, übergebe ich den Standardwert in der Regel an einen geeigneten Konstruktor von Konstruktor mit weniger Parametern. Zum Beispiel

final class Example { 

    private final String name; 

    Example() { 
    this("My Example"); 
    } 

    Example(String name) { 
    this.name = name; 
    } 

} 
1

zuteilt dies tatsächlich Speicher auf den Haufen? Nein, es ist auf dem Stapel zugeordnet. Globale Variablen werden auf dem Heap zugewiesen.

Wenn Ihre Methode beendet ist, wird der zugewiesene Speicherplatz aus dem Stapel zurückgegeben, und die Variable spielt keine Rolle mehr.

Ich frage mich immer, ob das als benötigt nicht mehr Speicher zuzuteilen Es wird auf die Variable für einen Referenzspeicher auf dem Stapel zuweisen. Diese Referenz wird nicht benötigt, wenn Sie die Funktion als Argument übergeben. Die Funktion muss jedoch noch ausgewertet werden, und der zurückgegebene Wert wird auf den Stapel gelegt. Wenn Sie eine Variable dafür deklarieren, müssen einige zusätzliche Schreib- und Lesevorgänge ausgeführt werden, was in Bezug auf die heutigen leistungsfähigen Computer in den meisten Fällen keine Rolle spielen sollte.