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.

10voto

M Platvoet Punkte 1669

Meiner Meinung nach geht es fast nie um Leistung, sondern um Design. Ich halte die Verwendung statischer Methoden im Gegensatz zur Verwendung statischer Variablen nicht für falsch (aber ich nehme an, Sie sprechen tatsächlich von Methodenaufrufen).

Es geht einfach darum, wie man die Logik isoliert und ihr einen guten Platz gibt. Manchmal rechtfertigt das die Verwendung statischer Methoden, von denen java.lang.Math ist ein gutes Beispiel. Ich denke, wenn Sie die meisten Ihrer Klassen benennen XxxUtil o Xxxhelper sollten Sie Ihren Entwurf noch einmal überdenken.

9voto

akhil_mittal Punkte 20953

Ich habe nur einige der in den Antworten genannten Punkte zusammengefasst. Wenn Sie etwas falsch finden, können Sie es gerne korrigieren.

Skalierung: Es gibt genau eine Instanz einer statischen Variablen pro JVM. Angenommen, wir entwickeln ein Bibliotheksverwaltungssystem und haben beschlossen, den Namen eines Buches in eine statische Variable aufzunehmen, da es nur eine pro Buch gibt. Aber wenn das System wächst und wir mehrere JVMs verwenden, haben wir keine Möglichkeit, herauszufinden, mit welchem Buch wir es zu tun haben?

Gewinde-Sicherheit: Sowohl Instanzvariablen als auch statische Variablen müssen kontrolliert werden, wenn sie in einer Umgebung mit mehreren Threads verwendet werden. Eine Instanzvariable muss nur dann geschützt werden, wenn sie ausdrücklich von mehreren Threads gemeinsam genutzt wird, während eine statische Variable immer von allen Threads des Prozesses gemeinsam genutzt wird.

Prüfung: Obwohl prüfbares Design nicht gleichbedeutend mit gutem Design ist, werden wir selten ein gutes Design beobachten, das nicht prüfbar ist. Da statische Variablen einen globalen Zustand darstellen, ist es sehr schwierig, sie zu testen.

Über den Zustand nachdenken: Wenn ich eine neue Instanz einer Klasse erstelle, dann können wir über den Zustand dieser Instanz nachdenken, aber wenn sie statische Variablen hat, dann könnte sie in jedem Zustand sein. Warum? Weil es möglich ist, dass die statische Variable von einer anderen Instanz geändert wurde, da die statische Variable von allen Instanzen gemeinsam genutzt wird.

Serialisierung: Auch die Serialisierung funktioniert nicht gut mit ihnen.

Schöpfung und Zerstörung: Die Erstellung und Zerstörung von statischen Variablen kann nicht kontrolliert werden. Normalerweise werden sie beim Laden und Entladen des Programms erstellt und zerstört. Das bedeutet, dass sie schlecht für die Speicherverwaltung sind und außerdem die Initialisierungszeit beim Start erhöhen.

Aber was ist, wenn wir sie wirklich brauchen?

Aber manchmal haben wir ein echtes Bedürfnis nach ihnen. Wenn wir wirklich das Gefühl haben, dass wir viele statische Variablen benötigen, die in der gesamten Anwendung gemeinsam genutzt werden, dann besteht eine Möglichkeit darin, das Singleton-Designmuster zu verwenden, das alle diese Variablen enthält. Oder wir können ein Objekt erstellen, das diese statischen Variablen enthält und weitergegeben werden kann.

Auch wenn die statische Variable als final gekennzeichnet ist, wird sie zu einer Konstanten und der ihr einmal zugewiesene Wert kann nicht mehr geändert werden. Das bedeutet, dass sie uns vor allen Problemen bewahrt, denen wir aufgrund ihrer Veränderlichkeit gegenüberstehen.

7voto

Anuj Patel Punkte 16347

Statische Variablen schaffen vor allem Probleme mit der Sicherheit der Daten (jederzeit geändert, jeder kann sie ändern, direkter Zugriff ohne Objekt, usw.)

Für weitere Informationen lesen Sie diese Danke.

7voto

cetnar Punkte 9219

Mir scheint, dass Sie nach statischen Variablen fragen, aber Sie weisen in Ihren Beispielen auch auf statische Methoden hin.

Statische Variablen sind nicht böse - sie haben ihre Annahme als globale Variablen wie Konstanten in den meisten Fällen mit endgültigen Modifikator kombiniert, aber wie es sagte, verwenden Sie sie nicht übermäßig.

Statische Methoden, auch Utility-Methode genannt. Es ist nicht generell eine schlechte Praxis, sie zu verwenden, aber die größte Sorge ist, dass sie möglicherweise behindern. Tests.

Als Beispiel für ein großartiges Java-Projekt, das eine Menge Statik verwendet und es richtig macht, schauen Sie sich bitte an Rahmen spielen! . Außerdem gibt es Diskussion darüber in SO.

Statische Variablen/Methoden in Kombination mit statischem Import werden auch häufig in Bibliotheken verwendet, die die deklarative Programmierung in Java erleichtern: es einfach machen o Hamcrest . Ohne eine Vielzahl von statischen Variablen und Methoden wäre das nicht möglich.

Statische Variablen (und Methoden) sind also gut, aber verwenden Sie sie mit Bedacht!

6voto

Charles Goodwin Punkte 6206

Man könnte meinen, dass Sie in den meisten Fällen, in denen Sie eine statische Variable verwenden, wirklich die Singleton-Muster .

Das Problem mit globalen Zuständen ist, dass manchmal das, was in einem einfacheren Kontext als global sinnvoll ist, in einem praktischen Kontext etwas flexibler sein muss, und hier wird das Singleton-Muster nützlich.

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