statisch vs. nicht statisch

8

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.

    
Batty 15.12.2013, 08:11
quelle

4 Antworten

6

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 .:

%Vor%

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.

    
anubhava 15.12.2013, 08:15
quelle
3

Dies sind keine verbindlichen Regeln, aber es ist besser, ihnen zu folgen:

Wann statische Felder verwendet werden sollen:

  1. Konstanten Die beste Verwendung von statischen Feldern sind Konstanten, die auch final sein müssen.
  2. ThreadLocals In den meisten Fällen definieren Sie threadlokale Variablen statisch, andernfalls verlieren Sie normalerweise den Verweis darauf. Aber vergiss nicht, ihre Inhalte freizugeben, wenn sie nicht mehr gebraucht werden (oder du wirst auf Speicherlecks stoßen). Meistens sind diese Variablen auch final .
  3. Und in sehr seltenen Fällen, wenn Sie einen Verweis auf ein (semantisches) Singleton-Objekt behalten wollen, auf das von vielen Stellen aus zugegriffen werden kann. (Zum Beispiel eine Referenz auf Hibernate 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:

  1. Helper-Hilfsmethoden Dies ist der Normalfall, wenn eine Methode nicht vom Zustand des enthaltenen Objekts abhängt. Diese Methoden können nützlich sein, und Sie können darauf zugreifen, ohne ein Objekt instanziieren zu müssen.
  2. Factory-Methoden Factory-Methoden sind ein weiteres gutes Beispiel für die Verwendung von statischen Methoden.
  3. Private Methoden, die nicht vom Objektstatus abhängen , wenn eine private Methode nur keine Abhängigkeit vom Status des Objekts hat, ist es besser, static zu definieren, um ein wenig Leistung zu erzielen.
  4. void main (String []) Methode sollte auch statisch sein.
Amir Pashazadeh 15.12.2013 08:32
quelle
2

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.

    
Eden 15.12.2013 08:53
quelle
0

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.

    
fastcodejava 15.12.2013 08:18
quelle

Tags und Links