Bis vor ein paar Wochen dachte ich, ich verstehe, wann man Felder und Methoden static
oder non-static
machen kann. Wenn ein Feld (z. B. ein Objekt einer anderen Klasse) für eine beliebige Anzahl von Objekten für die Klasse eindeutig ist, sollte es zum Beispiel static
gemacht werden.
Aber dann habe ich vor ein paar Wochen über JVM Garbage Collection gelesen.
Ich verstehe, dass static
Felder niemals Garbage Collection sind und die ganze Zeit im Speicher bleiben, es sei denn, der Class Loader selbst wird durch Garbage Collection gesammelt.
Aber wenn ich dieses Feld static
nicht mache, wird zumindest Müll gesammelt.
Es scheint also, dass eine sehr dünne Linie dazwischen besteht, Felder / Methoden statisch zu machen oder nicht.
Kann mir jemand bitte diese dünne Linie bei der Entscheidung erklären, damit meine Bewerbung viel effizienter ist.
Es mag dünn sein, aber es gibt eine klare Unterscheidung. Sie deklarieren ein Feld als statisch, wenn es überhaupt nicht auf eine Instanz einer Klasse bezogen ist.
Eine einfache Anwendung des statischen Felds ist das Deklarieren von Konstanten mit dem Schlüsselwort final
, z. B .:
Das Gleiche gilt auch für Methoden. Sie deklarieren eine Methode als statisch, wenn sie nicht von der Instanz einer Klasse ODER vom Status der Klasse abhängig ist. Das ist der Grund, warum eine statische Methode Instanzelemente einer Klasse nicht verwenden kann.
Dies sind keine verbindlichen Regeln, aber es ist besser, ihnen zu folgen:
Wann statische Felder verwendet werden sollen:
final
sein müssen. SessionFactory
in HibernateUtils). Denken Sie daran, dass statische Felder während der Laufzeit Ihrer Anwendung normalerweise unveränderbar sein sollten (sie werden manchmal während des Starts und des Abbruchs der Anwendung geändert).
Wann man statische Methoden benutzt:
static
zu definieren, um ein wenig Leistung zu erzielen. Statische Felder sind ein Konzept , über das Sie sich Gedanken machen sollten, bevor Sie es als eine Methode verwenden, um die Effizienz Ihrer Anwendung zu erhöhen.
Wie Sie wissen, wenn ein statischer Modifikator in einem Feld enthalten ist, ist keine Instanz der Klasse erforderlich, damit sie verwendet werden kann. Und dadurch hat es den gleichen Wert für die gesamte Anwendung. Auf der einen Seite kann es zu vielen Fehlern in einer Lese- / Schreibumgebung mit mehreren Threads kommen, wenn Sie den Zugriff nicht richtig serialisieren, auf der anderen Seite ist es gut, wenn Sie versuchen, (Ein Feld mit einem Wert, der sich während der Lebensdauer der Anwendung nicht ändert und daher nicht muss GC sein )
Im Großen und Ganzen sollten Sie statische Schreib- / Lese-Felder vermeiden, da dies zu weiteren Fehlern in Ihrer Anwendung führt. Wenn Sie denselben Wert für viele Instanzen derselben Klasse verwenden, wird dies im OO-Design nicht als sinnvoller Anwendungsfall für das statische Feld angesehen. Nicht weil es weniger oder effizienter ist, sondern weil es das Konzept der Kapselung durchbricht.
Felder werden nicht static
über Garbage Collection gemacht. Das ist ein ganz neuer Bereich, den es zu berücksichtigen gilt. Wenn der Speicher für Ihr static
-Feld riesig ist, dann sollten Sie non-static
machen.
Tags und Links java garbage-collection