2016-03-18 6 views
0

Nun von all den Dingen, die ich darüber gelesen habe, wie böse statische Variablen sein können, wurde ich ein statisches fobic. Ich habe solche Angst davor, eine statische Variable in ein großes Projekt zu stecken, weil ich das Gefühl habe, dass ich es bereuen könnte, obwohl es den Code einfacher macht. Ich habe nie verstanden, wenn es in Ordnung ist, eine statische zu verwenden, also versuche ich, sie nie zu verwenden. Ich entwickle dieses große Spiel, und eine statische entityManager würde so hilfreich sein, stattdessen landete ich entityManager Instanz zu jeder Klasse, die es brauchen, aber manchmal ist es so schwer, es zu bestehen. Und es wäre so einfach zu tun EntityManager.addEntity(Entity);Ich bin ein statischer fobic

Ich weiß, dass es Themen wie "Wann ist es in Ordnung, statische zu verwenden?" aber es scheint, es gibt keine einfache Möglichkeit, dies auf eine einfache Weise zu erklären.

Kann mir jemand auf leicht englische Weise sagen, wann es in Ordnung ist, statische Variablen zu verwenden?

Englisch ist nicht meine primäre Sprache, also bitte beachten Sie das.

+4

Die Übergabe einer 'entityManager'-Instanz ist der richtige Weg, aber Sie können es einfacher machen, Tools wie Dependency Injection zu verwenden. Du machst das Richtige. –

+0

Meiner Meinung nach sollten Sie den statischen Entity Manager nicht verwenden, wenn Sie ihn selbst erstellen, da der Entity Manager nicht Thread-sicher ist. Wenn Sie bereits in einer containerverwalteten Umgebung arbeiten, können Sie sie sicher verwenden, da Container wie Spring die Thread-Sicherheit des Entity Managers mit kontextsensitivem Proxy verwalten – Bunti

Antwort

2

1) es völlig in Ordnung ist statisch Instanzen mit einem abschließenden Schlüsselwort als verwenden Nur-Lese-Konstanten

2), wenn Sie Singleton Dienste wollen, die in verschiedenen Komponenten zugänglich sind, es ist besser wie Spring Dependency Injection-Frameworks verwenden DI, CDI oder Guice verwalten sie

2

static groß ist für staatenlos, reine Methoden, wie String.format()

static für Konstanten groß ist, wie:

public static final double PI = 3.14159; 

static ist ideal für private Felder, für die es nach logischer Definition immer nur einen einzigen Wert geben kann, wie die Liste der Werte in einem enum (und die öffentlichen Methoden für den Zugriff auf diese privaten Felder).

Während Sie in der Regel nur einen EntityManager in einer Anwendung haben, gibt es nichts falsch daran, mehr als eins. Sie könnten 3 oder 3 Millionen haben. Weil es nicht streng einen Entity Manager gibt, sollte es nicht statisch sein. Es herumzugehen ist der richtige Weg, damit umzugehen.

+2

Minor side note: Seien Sie vorsichtig mit statischen Methoden, die einbrechen Komponententestumgebungen.Es geht also nicht nur darum, "staatenlos" zu sein; Es geht auch um "läuft gut", wenn Sie im Rahmen Ihrer Komponententests aufgerufen werden. – GhostCat

1

Wenn Sie statische Daten verwenden, führen Sie eine enge Kopplung in Ihrer Codebasis ein. Wenn dieses statische Zeug privat und intern in einer Klasse ist, ist das kein Problem und es gibt nichts, vor dem man Angst haben muss. Für alle anderen ist es jedoch unmöglich, alternative Implementierungen bereitzustellen, und jetzt können Sie keine richtigen Komponententests durchführen.

Nun, wenn es zu viel Arbeit für Sie scheint, diesen Manager überall zu übergeben, glauben Sie mir, es bringt viel Flexibilität. Auf der anderen Seite, wenn es zu viele Manager gibt, die herumgereicht werden, überdenken Sie Ihre Klassen und vielleicht teilen Sie sie in kleinere Teile. Im Idealfall sollte jede Klasse nur für eine Sache verantwortlich sein.

Verwandte Themen