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.

5voto

ptyx Punkte 3984

Ein weiterer Grund: Zerbrechlichkeit.

Wenn Sie eine Klasse haben, erwarten die meisten Menschen, dass Sie diese nach Belieben erstellen und verwenden können.

Sie können dokumentieren, dass dies nicht der Fall ist, oder sich dagegen schützen (Singleton/Factory-Muster) - aber das bedeutet zusätzliche Arbeit und damit zusätzliche Kosten. Selbst dann besteht in einem großen Unternehmen die Möglichkeit, dass jemand irgendwann versucht, Ihre Klasse zu verwenden, ohne all die netten Kommentare oder die Factory zu beachten.

Wenn Sie viel mit statischen Variablen arbeiten, wird das nicht funktionieren. Bugs sind teuer.

Zwischen einer Leistungsverbesserung von 0,0001 % und der Robustheit gegenüber Änderungen durch potenziell ahnungslose Entwickler ist die Robustheit in vielen Fällen die bessere Wahl.

4voto

Andres Punkte 10201

Statische Variablen sind weder gut noch böse. Sie stellen Attribute dar, die die gesamte Klasse und nicht eine bestimmte Instanz beschreiben. Wenn Sie einen Zähler für alle Instanzen einer bestimmten Klasse benötigen, wäre eine statische Variable der richtige Ort, um den Wert zu speichern.

Probleme treten auf, wenn Sie versuchen, statische Variablen für die Speicherung von instanzbezogenen Werten zu verwenden.

4voto

Zdeněk Pavlas Punkte 260

An statischen Variablen ist an sich nichts auszusetzen. Es ist nur die Java-Syntax, die fehlerhaft ist. Jede Java-Klasse definiert eigentlich zwei Strukturen - ein Singleton-Objekt, das statische Variablen kapselt, und eine Instanz. Beides im selben Quelltextblock zu definieren ist das pure Übel und führt zu einem schwer lesbaren Code. Scala hat das richtig gemacht.

4voto

jrodriguez Punkte 63

Ihr Beitrag enthält im Wesentlichen zwei Fragen.

Zunächst zu den statischen Variablen. Statische Variablen sind völlig unnötig und ihre Verwendung kann leicht vermieden werden. In OOP-Sprachen im Allgemeinen und in Java im Besonderen werden Funktionsparameter per Referenz übergeben, das heißt, wenn Sie ein Objekt an eine Funktion übergeben, übergeben Sie einen Zeiger auf das Objekt, so dass Sie keine statischen Variablen definieren müssen, da Sie einen Zeiger auf das Objekt an jeden Bereich übergeben können, der diese Information benötigt. Auch wenn dies bedeutet, dass Sie Ihren Speicher mit Zeigern füllen, bedeutet dies nicht unbedingt eine schlechte Leistung, da die aktuellen Speicherauslagerungssysteme dafür optimiert sind und die Seiten, auf die die Zeiger verweisen, die Sie an den neuen Bereich übergeben haben, im Speicher behalten; die Verwendung statischer Variablen kann dazu führen, dass das System die Speicherseite lädt, auf der sie gespeichert sind, wenn auf sie zugegriffen werden muss (dies geschieht, wenn auf die Seite lange Zeit nicht zugegriffen wurde). Eine gute Praxis ist es, alle statischen Variablen in kleinen "Konfigurationsclases" zusammenzufassen, um sicherzustellen, dass das System sie alle in derselben Speicherseite ablegt.

Zweitens, über statische Methoden. Statische Methoden sind nicht so schlecht, aber sie können die Leistung schnell verringern. Denken Sie zum Beispiel an eine Methode, die zwei Objekte einer Klasse vergleicht und einen Wert zurückgibt, der angibt, welches der Objekte größer ist (typische Vergleichsmethode). Diese Methode kann statisch oder nicht statisch sein, aber wenn sie aufgerufen wird, ist die nicht statische Form effizienter, da sie nur zwei Referenzen (eine für jedes Objekt) lösen muss, im Gegensatz zu den drei Referenzen, die die statische Version der gleichen Methode lösen muss (eine für die Klasse plus zwei, eine für jedes Objekt). Aber wie gesagt, das ist gar nicht so schlecht, denn wenn wir uns die Klasse Math ansehen, finden wir eine Menge mathematischer Funktionen, die als statische Methoden definiert sind. Das ist wirklich effizienter, als all diese Methoden in die Klasse zu packen, die die Zahlen definiert, denn die meisten von ihnen werden nur selten verwendet, und wenn man sie alle in die Zahlenklasse aufnimmt, wird die Klasse sehr komplex und verbraucht unnötig viele Ressourcen.

Fazit: Vermeiden Sie die Verwendung von statischen Variablen und finden Sie das richtige Leistungsgleichgewicht, wenn Sie mit statischen oder nicht statischen Methoden arbeiten.

PS: Entschuldigung für mein Englisch.

4voto

tomasb Punkte 1635

Alles (kann:) seinen Zweck haben, wenn Sie eine Reihe von Themen haben, die Freigabe/Cache Daten und auch alle zugänglichen Speicher (damit Sie sich nicht in Kontexte innerhalb einer JVM aufteilen) ist die statische Variante die beste Wahl

-> natürlich kann man nur eine Instanz erzwingen, aber warum?
ich finde einige der Kommentare in diesem Thread böse, nicht die 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