Singletons und Konstanten

8

Ich mache ein Programm, das einige Konstanten benutzt. Jedes Mal, wenn ich eine Konstante verwenden musste, würde ich sie als

definieren %Vor%

in der Klasse, wo ich es brauchen würde. Nach einiger Zeit wurde mir klar, dass einige Konstanten in mehr als einer Klasse benötigt würden.

Zu dieser Zeit hatte ich 3 Möglichkeiten:

  1. Um sie in den verschiedenen Klassen zu definieren, die sie brauchten. Dies führt zu Wiederholungen. Wenn ich später aus irgendeinem Grund einen von ihnen ändern muss, müsste ich alle Klassen einchecken, um sie überall zu ersetzen.
  2. Um eine statische Klasse / Singleton mit allen Konstanten als public zu definieren.
  3. Wenn ich ein konstantes X in ClassA, ClassB und ClassC benötige, könnte ich es einfach in ClassA als public definieren und ClassB und ClassC dann auf sie verweisen. Diese Lösung scheint mir nicht gut zu sein, da sie sogar noch mehr Abhängigkeiten mit sich bringt, als die Klassen bereits haben.

Ich habe meinen Code mit der zweiten Option implementiert. Ist das die beste Alternative? Ich fühle, dass ich wahrscheinlich eine andere bessere Alternative vermisse.

Was mich bei der Verwendung des Singletons beunruhigt, ist, dass es keinem Benutzer der Klasse klar ist, dass diese Klasse den Singleton verwendet. Vielleicht könnte ich eine ConstantsClass erstellen, die alle benötigten Konstanten enthielt, und dann würde ich sie im Konstruktor an die Klassen übergeben, die sie brauchen?

Danke

edit: Ich benutze das meistens für komplexe Typen, nicht für Intets und Strings. Zumindest im C # -Fall, der einen Unterschied macht, da ich das Schlüsselwort const nicht verwenden kann.

    
devoured elysium 02.05.2010, 21:50
quelle

6 Antworten

5

Keine Formulierung über C #, aber in Java gibt es mehrere Möglichkeiten, dieses Problem zu lösen.

  1. Ändern Sie den Zugriffsmodifikator auf die Standardeinstellung (nur Paket) ) oder public . Die einfachste Lösung.

  2. Gruppieren Sie sie in einem Paket - privat oder public enum . Am einfachsten, wenn diese Werte miteinander verwandt sind . Z.B. Role.ADMIN , Role.USER , Role.GUEST , usw.

  3. Deklarieren Sie sie in einem Paket-private oder public interface und lassen Sie die Klassen implementieren. Tun Sie dies nur, wenn diese Konstanten zum einigen -Vertrag gehören, müssen die Klassen ebenfalls folgen.

  4. Fügen Sie sie in Eigenschaftendateien ein und laden Sie sie als private static final Properties und addiere public static String getProperty(String key) . Wickeln Sie dies in eine Paket-private oder public Configuration -Klasse ein. Nützlicher, wenn diese Konstanten möglicherweise für Änderungen anfällig sind, die Sie dann extern steuern könnten.

Auf Konstanten muss nicht von einer Instanz zugegriffen werden, daher macht die ganze Singleton-Idee keinen Sinn.

    
BalusC 02.05.2010, 22:01
quelle
4

Benutze eine Eigenschaftendatei und lege die Konstanten dort hinein.

    
Romain Hippeau 02.05.2010 21:53
quelle
2

ConfigurationManager.AppSettings-Eigenschaft in .NET existiert nur für diesen Zweck Grund. Sie fügen die Einstellungen in Konfigurationsdateien ein, unter der Annahme, dass dies Elemente sind, die Sie an einem Ort einstellen möchten, z. Für eine Website, die ASP.Net verwendet, ist web.config ein Ort, an dem Einstellungen vorgenommen werden können, so dass Entwicklungs-, Test- und Produktionsumgebungen unterschiedliche Einstellungen für ihre Ausführung haben können.

    
JB King 02.05.2010 22:01
quelle
2

Soweit int betroffen ist, verwende ich normalerweise ein enum in C #

%Vor%

Für andere Arten - wie BalusC bereits erwähnt - ist eine versiegelte Klasse alles was du brauchst

%Vor%     
Filburt 02.05.2010 22:20
quelle
1

Ich würde es an einem Ort definieren, in einer der Klassen, die es brauchten. Ich würde es statisch, endgültig und öffentlich machen, so dass es wirklich konstant war und jedem anderen Kunden zugänglich war, der es brauchte.

    
duffymo 02.05.2010 21:53
quelle
0

Ein Ansatz hierfür wäre die Verwendung von Spring, das sowohl in Java als auch in .NET verfügbar ist.

www.springsource.org
www.springframework.de .net - .net

Ansonsten würde ich eine Konfigurationsdatei verwenden.

    
McAden 02.05.2010 21:54
quelle

Tags und Links