Umwandlung von Kompilierzeit-Konstanten zu Laufzeit-Konstanten und umgekehrt


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, 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.

Page: 1 2 3 4 5

ZDNet.de Redaktion

Recent Posts

So günstig & effizient war Content Produktion noch nie: Neues Content System erobert deutschen Markt

Kontinuierliche Content Produktion und Markenaufbau sind essentieller Pfeiler von langfristigen Unternehmenserfolg. Das ist mittlerweile auch…

5 Tagen ago

Lenovo übertrifft die Erwartungen und hebt Prognose an

KI-Funktionen beschleunigen die Erholung des PC-Markts. Der Nettogewinn legt um 44 Prozent zu, der Umsatz…

5 Tagen ago

Bedrohungsakteure betten Malware in macOS-Flutter-Anwendungen ein

Googles App-Entwickler-Kit dient der Tarnung des schädlichen Codes. Der Sicherheitsanbieter Jamf hält die Schadsoftware für…

5 Tagen ago

CopyRhadamantys greift weltweit Unternehmen an

Ausgeklügelte Phishing-Kampagne verwendet eine weiterentwickelte Version der Rhadamanthys-Stealer-Malware.

1 Woche ago

Facebook Marketplace: EU verhängt Geldbuße von fast 800 Millionen Euro gegen Meta

Die EU-Kommission kritisiert die Verknüpfung von Facebook und dem hauseigenen Online-Kleinanzeigendienst. Sie sieht darin einen…

1 Woche ago

Umfrage: Angestellte in Deutschland unterschätzen NIS-2-Richtlinie

Fast zwei Drittel halten jedoch eine Umsetzung aller Vorgaben von NIS 2 bis Jahresende für…

1 Woche ago