Lösung Nr. 3
In den vorhergehenden Lösungen müssen die Konstanten vor main() initialisiert werden. Innerhalb von main() kann eine Konstante nicht initialisiert werden, da sich ihr Wert nicht ändern lässt. Dies ist ein wesentlicher Nachteil, da hierdurch das Properties-Objekt, von dem gelesen wird, vor der Initialisierung der Konstante initialisiert werden muss:
Was aber, wenn alle Konstanten von einer Datei initialisiert werden müssen, deren Name ein Befehlszeilenargument ist? In diesem Fall müssen die Konstanten nach dem Eintritt in main() initialisiert werden. Hierfür wird eine Methode verwendet, die der oben dargestellten ähnlich ist und die folgenden Schritte umfasst:
- Erstellung einer Template-Klasse const_val< type>, die eine Konstante darstellt. (Client-Code verwendet diese wie einen const-Typ.)
- Das Properties-Objekt und der Eigenschaftsname für die Initialisierung der Konstante bei ihrer Konstruktion werden übergeben.
- Die Konstante wird initialisiert, wenn initialize() aus dem Properties-Objekt (mit dem Eigenschaftsnamen) aufgerufen wird.
- Aufruf von all_constants::initialize_constants(), welches initialize() für alle bestehenden const_val constants in main() aufruft.
Jeder Versuch, eine Konstante oder dependent_static vor ihrer Initialisierung zu verwenden, führt zu einer Fehlermeldung. Das ist hilfreich, wenn man vergisst, eine statische Variable als abhängig zu kennzeichnen. Verwendet solch eine Variable eine Laufzeit-Konstante, erkennt man diesen Fehler beim ersten Durchlauf von Listing G.
Zu beachten ist, dass eine durch den Konstruktor einer globalen Variablen verursachte Exception nicht abgefangen werden kann – die Anwendung wird beendet (Listing H). Hier geschieht dies aber nicht, da die globalen Variablen nur innerhalb main() initialisiert werden. Die Initialisierung kann sogar von einem try-catch-Block umgeben und die Anwendung etwas galanter beendet werden, wie in Listing I gezeigt wird.
Ein Blick auf Listing J ergibt, dass nun eine neue abhängige statische s_dbConnection besteht. Zu beachten sind die beiden Property-Dateien: props.txt und props2.txt. Interessant ist zu sehen, was geschieht, wenn diese Dateien dem Programm als Argument übergeben werden.
Lösung Nr. 4
Diese Lösung wird mit const_val und dependent_static einfacher. Wenn man const_val konstruiert, gehört der Eigenschaftsname konzeptuell zum Properties-Objekt. Der Ausdruck
ist intuitiver als
Mit dieser Lösung wird das ermöglicht.
Ist die Initialisierung einer Konstante nicht möglich (die Eigenschaft existiert nicht für das Properties-Objekt), kann ihr ein Default-Wert vergeben werden. Hierfür wird einfach ein weiteres Argument hinzugefügt:
Die Initialisierung einer Konstante könnte fehlschlagen, wenn keine Eigenschaft existiert, was eine Exception auslöst. Wird ein Default-Wert vergeben, wird die Konstante auf diesen Wert gesetzt und das Programm weiterhin ausgeführt.
Zur Initialisierung sowohl von Konstanten als auch dependent_statics wird constants_and_dependents::initialize anstelle von all_constants::initialize_constants() und all_dependent_statics::initialize_statics() aufgerufen.
Nun können Abhängigkeiten zwischen dependent_static Objekten verwaltet werden. Hängt dependent_static A von dependent_static B ab, wird A nach B initialisiert.
s_AllUsers aus der vorhergehenden Lösung muss einige Daten in einem s_statisticsLog ausgeben. Sowohl s_AllUsers als auch s_statisticsLog sind dependent_statics. Damit die Anwendung ordnungsgemäß funktioniert, muss s_statisticsLog vor AllUsers initialisiert werden. Das Hinzufügen von Abhängigkeiten ist relativ einfach:
- B benennen
- Dem Namen von B die Abhängigkeit von A hinzufügen
Hier ein Beispiel:
Sowohl set_dependent_static_name und add_dependency_on_static sind Hilfsklassen, deren einzige Aufgabe darin besteht, ein dependent_static zu benennen oder eine Abhängigkeit herzustellen.
In Listing K sind zwei FIXME-Kommentare ersichtlich. Wenn das Programm unverändert ausgeführt wird, ist das Resultat wahrscheinlich eine Exception. Entfernt man den Kommentar aus diesen zwei Zeilen, läuft das Programm wie erwartet.
Neueste Kommentare
Noch keine Kommentare zu Umwandlung von Kompilierzeit-Konstanten zu Laufzeit-Konstanten und umgekehrt
Kommentar hinzufügenVielen Dank für Ihren Kommentar.
Ihr Kommentar wurde gespeichert und wartet auf Moderation.