Java - best-practice für die Erstellung von Paket-weiten oder globalen Variablen
Was ist die standard-Vorgehensweise/best practice zum erstellen von Variablen, Programm - oder Paket-Breite in Java?
Möchte ich einige Globale Variablen, die zugänglich sind, die von mehreren Klassen. Beispiele für diese globalen Variablen wäre Dinge wie ein boolean-flag testModeOn, eine Sprache, die Einstellung, aktuelle lokale server, Uhrzeit-Anzeige, format, etc. Nach einigen anderen Fragen (nämlich diese eine) es gibt keine globalen Variablen, aber es gibt einige Workarounds über Schnittstellen (nicht empfohlen?) oder Klassen. Da der ursprüngliche poster nicht erklären, Ihre situation, Sie bekam fast alle Antworten unter der Sonne und ich möchte Sie Fragen, speziell für die Programm-Konfiguration-Variablen.
Ist es besser, eine Klasse zu erstellen/Paket/Schnittstelle und importieren Sie Sie dann in meine working-class/package? Gibt es irgendetwas, was ich beachten sollte, wenn Sie versuchen zu implementieren, die diese Variablen verwenden Sie eine separate Klasse oder Schnittstelle? Gibt es eine andere Möglichkeit, um fudge-Paket-level-Variablen, da Java offensichtlich gar nicht nativ?
HINWEIS: Diese Variablen würde wohl auch nicht ändern, außer wenn das Programm neu kompiliert.
- Das Singleton-Muster.
- Von "singleton-pattern", du meinst, ich soll eine Klasse erstellen, die nur je eine Instanz/ein Objekt erstellt?
- Ja, und diese Klasse enthält Globale Einstellungen, die zugegriffen werden kann durch diese einzelne Klasse. Darüber hinaus werden die singleton kann sich über anhaltenden oder serialisieren Sie die Einstellungen, falls gewünscht.
- kein Weg ist. Tun Sie nie ein singelton c2.com/cgi/wiki?SingletonsAreEvil und i.stack.imgur.com/Dzdio.png
- instanziieren eine zweite Instanz." gut, nie gearbeitet, mit real-life-Probleme, die ich übernehmen - manchmal ist es am besten, um etwas durchzusetzen, anstatt "das beste hoffen".
- Ich bin nicht einverstanden, dass das Singleton-Muster ist hier relevant. Mit
static
Felder bedeutet, dass keine Objektinstanz erstellt werden muss, daher das Singleton-Objekt noch gar nicht erforderlich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du redest, Konstanten, dann sollten Sie erklärt werden, als
static final
Felder in einer Klasse (nicht in einer Schnittstelle, nach Joshua Bloch).Wenn Sie reden können Einstellungen ändern on the fly, dann könnten diese entweder
static
Felder in einer Klasse, oder Sie können eine ConfigHandler Klasse zu verwalten, die Einstellung und das abrufen der konfigurierbaren Werte.Über die Klasse Felder für veränderliche Werte führen möglicherweise zu concurrency-Problemen, so dass, wenn Ihre Anwendung ist multi-threaded könnte es besser sein, erstellen Sie eine ConfigHandler Klasse verwaltet parallelen Zugriff gezielt und bietet
synchronized
Methoden, um Probleme zu vermeiden.static final
an der Spitze einer entsprechenden Klasse wäre der beste Weg vorwärts. Vergessen Sie nicht, dassfinal
nicht aufhören, den Inhalt einer Auflistung oder eines Arrays geändert werden, so müssen Sie möglicherweise finden Sie in der Dokumentation für die java.util.Klasse Sammlungen bietet eine Reihe von Methoden genannt unmodifiableXxxx, aus denen Sie Sammlung erstellen Sie Objekte, die nicht zulassen, dass Ihre Inhalte neu geordnet werden.static final
wie gut? Und wie würde ich die Referenz der Variablen in dieser KlasseMyClass.myStaticField
?static
also nicht befürchten, dass. Und du hast Recht, auf den Sie verweisen statische Felder mit dem Namen der Klasse. Siehe Verständnis-Klasse-Mitglieder für eine ausführlichere Erklärung.Meiner Meinung nach, der beste Ansatz, um die übergabe alles in euren Klassen ist die Verwendung von dependency injection. Dies würde zu beseitigen Ihre Notwendigkeit für Singletons, statische Konstanten und ähnliches.
Je nachdem, welche DI Euch gefallen, hier sind einige link Lösungen für das problem, das Sie beschreiben:
Erstellen Sie eine Bean-Klasse, wenn mehrere Variablen werden benötigt, um verwendet werden, in verschiedenen Klassen. Am besten erstellen Sie eine private variable mit Getter und setter.
Im Allgemeinen gibt es so viele Möglichkeiten, es falsch machen zu diesem Thema.
Der einfache Weg ist, um ein Singelton.
Dies ist nicht eine option - Singelton ist ein Anti-Pattern. http://c2.com/cgi/wiki?SingletonsAreEvil
So, was es sonst noch so gibt? Eine Schnittstelle
public static final
Variablen?Keine option - Das ist einfach nicht der Anwendungsfall für eine Schnittstelle: https://stackoverflow.com/a/2659740/1248724
so, was es sonst noch so gibt?
Die Antwort ist:
Was ich bevorzuge, ist die spring-boot-Möglichkeit (z.B. Dependency Injection)
Hier ein code Beispiel, das ist offensichtlich Frühling.
Wenn Sie sind mit einigen ähnlichen Rahmen wie die Dinge sein könnten, einfach archiviert werden.
Wenn das irgendwie nicht möglich, in Ihrer Umgebung, die ich hatte, um code so etwas wie dieses:
Vorteile:
- Sie können überprüfen Sie Ihre Eigenschaften, wie auch immer Sie wollen.
- Sie können die Arbeit mit dem java-security-manager-wenn Sie möchten, um
Nachteile:
- Möglicherweise haben Sie zu pflegen eine Reihe von code (dieser sollte es einfacher sein mit lambda-Ausdrücke)
- Nicht so toll wie die Art und Weise der Frühling bietet hier zum Beispiel.
Einen sehr ähnlichen Ansatz, den ich gerade gefunden: https://stackoverflow.com/a/3931399/1248724