722 Stimmen

Warum werden statische Variablen als böse angesehen?

Ich bin ein Java-Programmierer, der neu in der Unternehmenswelt ist. Vor kurzem habe ich eine Anwendung entwickelt, die Groovy und Java. Der gesamte von mir geschriebene Code enthielt eine ganze Reihe von statischen Elementen. Ich wurde von den leitenden Technikern gebeten, die Anzahl der verwendeten statischen Elemente zu verringern. Ich habe darüber gegoogelt und festgestellt, dass viele Programmierer ziemlich gegen die Verwendung statischer Variablen sind.

Ich finde statische Variablen bequemer zu verwenden. Und ich nehme an, dass sie auch effizient sind (bitte korrigieren Sie mich, wenn ich falsch liege), denn wenn ich eine Funktion innerhalb einer Klasse 10.000 Mal aufrufen müsste, wäre ich froh, wenn ich die Methode statisch machen und ein einfaches Class.methodCall() zu verwenden, anstatt den Speicher mit 10.000 Instanzen der Klasse zu überladen, richtig?

Außerdem reduziert die Statik die Abhängigkeiten von anderen Teilen des Codes. Sie können als perfekte Zustandshalter fungieren. Darüber hinaus finde ich, dass Statik in einigen Sprachen wie Smalltalk y Scala . Warum also ist dieser Widerstand gegen die Statik unter Programmierern weit verbreitet (insbesondere in der Java-Welt)?

PS: Bitte korrigieren Sie mich, wenn meine Annahmen zur Statik falsch sind.

34voto

sternr Punkte 5844

Es gibt 2 Hauptprobleme mit statischen Variablen:

  • Thread-Sicherheit - statische Ressourcen sind per Definition nicht thread-sicher
  • Code-Implizität - Sie wissen nicht, wann eine statische Variable instanziiert wird und ob sie vor einer anderen statischen Variable instanziiert wird oder nicht

21voto

Afee Punkte 2639

Zusammenfassung einiger grundlegender Vor- und Nachteile der Verwendung statischer Methoden in Java:

Vorteile:

  1. Globaler Zugriff, d.h. nicht an eine bestimmte Objektinstanz gebunden.
  2. Eine Instanz pro JVM.
  3. Kann über den Klassennamen aufgerufen werden (kein Objekt erforderlich).
  4. Enthält einen einzigen Wert, der für alle Instanzen gilt.
  5. Wird beim Start der JVM geladen und stirbt, wenn die JVM herunterfährt.
  6. Sie ändern den Zustand des Objekts nicht.

Benachteiligungen:

  1. Statische Elemente sind immer Teil des Speichers, unabhängig davon, ob sie verwendet werden oder nicht.
  2. Sie können die Erstellung und Zerstörung statischer Variablen nicht kontrollieren. Nützlicherweise werden sie beim Laden des Programms erstellt und beim Entladen des Programms (oder beim Herunterfahren der JVM) zerstört.
  3. Sie können Statik thread-sicher machen, indem Sie synchronisieren, aber Sie benötigen einige zusätzliche Anstrengungen.
  4. Wenn ein Thread den Wert einer statischen Variable ändert, kann das möglicherweise die Funktionalität anderer Threads unterbrechen.
  5. Sie müssen "statisch" kennen, bevor Sie es verwenden.
  6. Sie können statische Methoden nicht außer Kraft setzen.
  7. Die Serialisierung funktioniert nicht gut mit ihnen.
  8. Sie nehmen nicht an der Laufzeit-Polymorphie teil.
  9. Es gibt ein Speicherproblem (bis zu einem gewissen Grad, aber nicht viel, denke ich), wenn eine große Anzahl von statischen Variablen/Methoden verwendet werden. Denn sie werden erst nach Beendigung des Programms in den Müll geworfen.
  10. Statische Methoden sind auch schwer zu testen.

17voto

Jack Edmonds Punkte 29705

Statische Variablen werden im Allgemeinen als schlecht angesehen, weil sie einen globalen Zustand darstellen und daher viel schwieriger zu verstehen sind. Insbesondere verstoßen sie gegen die Annahmen der objektorientierten Programmierung. In der objektorientierten Programmierung hat jedes Objekt seinen eigenen Zustand, der durch (nicht-statische) Instanzvariablen dargestellt wird. Statische Variablen repräsentieren einen instanzübergreifenden Zustand, der sehr viel schwieriger zu testen ist. Dies liegt vor allem daran, dass es schwieriger ist, Änderungen an statischen Variablen in einem einzigen Test zu isolieren.

Dabei ist es wichtig, zwischen regulären statischen Variablen (die im Allgemeinen als schlecht angesehen werden) und endgültigen statischen Variablen (auch bekannt als Konstanten; nicht so schlecht) zu unterscheiden.

15voto

Justin M. Keyes Punkte 6138

Da es niemand* erwähnt hat: Gleichzeitigkeit. Statische Variablen können Sie überraschen, wenn Sie mehrere Threads haben, die die statische Variable lesen und in sie schreiben. Dies ist in Webanwendungen (z. B. ASP.NET) üblich und kann zu einigen ziemlich ärgerlichen Fehlern führen. Wenn Sie z. B. eine statische Variable haben, die von einer Seite aktualisiert wird, und die Seite von zwei Personen "fast zur gleichen Zeit" angefordert wird, kann ein Benutzer das vom anderen Benutzer erwartete Ergebnis erhalten oder Schlimmeres.

Statik reduziert die Abhängigkeiten von anderen Teilen des Codes. Sie können als perfekte Zustandshalter fungieren

Ich hoffe, Sie sind darauf vorbereitet, Schlösser zu benutzen und mit Streitigkeiten umzugehen.

*Aktuell, Preet Sangha es erwähnt.

13voto

Jérôme Verstrynge Punkte 54576

Wenn ich 10.000 Aufrufe einer Funktion innerhalb einer Klasse machen müsste, wäre ich die Methode statisch zu machen und ein einfaches class.methodCall() verwenden, anstatt den Speicher mit 10.000 Instanzen der Klasse zu überladen. Instanzen der Klasse zu belasten, richtig?

Sie müssen abwägen zwischen der Notwendigkeit, Daten in ein Objekt mit einem Zustand zu kapseln, und der Notwendigkeit, einfach das Ergebnis einer Funktion auf einigen Daten zu berechnen.

Außerdem verringert die Statik die Abhängigkeiten von anderen Teilen des Codes.

Das gilt auch für die Verkapselung. In großen Anwendungen neigt die Statik dazu, Spaghetti-Code zu produzieren und ermöglicht nicht ohne weiteres Refactoring oder Tests.

Auch die anderen Antworten liefern gute Gründe gegen eine übermäßige Verwendung der Statik.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X