2016-04-23 8 views
0

Ich arbeite an einer Java-Anwendung, wo in erhalten wir XML, die XML enthält einige Daten aus vielen Regionen auf der ganzen Welt. So sieht xml so ausLaden Kompilierzeit Konstanten von Eigenschaftendatei

<Shipment> 
     <Region> 
       <name>China</name> 
       <calculatedValue>0.001</calculatedValue> 
       <deviation>-1<deviation> 
     </Region> 
     <Region> 
       <name>Russia</name> 
       <calculatedValue>0.091</calculatedValue> 
       <deviation>-1<deviation> 
     </Region> 
     <Region> 
       <name>UK</name> 
       <calculatedValue>2.001</calculatedValue> 
       <deviation>-12<deviation> 
     </Region> 
     // lots of other regions // 
</Shipment> 

Wir haben eine Pojo namens Dock.

Wir extrahieren die Region aus diesem XML-Objekt, erstellen ein Regionsobjekt und fügen es zum Dock-Objekt hinzu. Jetzt haben wir auch eine Enum, die alle von unserer Anwendung unterstützt definiert.

enum SupportedRegions{ 
    CHINA (201, "APAC"), 
    RUSSIA (202, "EUR") 
} 

Jetzt bekommen wir Anforderung, auch andere Regionen zu unterstützen. Jetzt möchten wir unseren Code so umgestalten, dass es einfach und konfigurierbar wird, Regionen durch das Support-Team zu unterstützen.

Wir wollen es aus dem Code verschieben und in einer Eigenschaftendatei mit minimalen Änderungen pflegen. Wir haben einen Anrufcode wie.

Jetzt, wenn ich die enum entfernen und alle Regionen in Eigenschaften verschieben. Ich muss mein Dock-Klasse so etwas wie dieses

private Map<String, Region> regionalShipmentDetails = // 
    //some field and getter setter. 
    getShipmentDetailsForRegion (String region) { this.regionalShipmentDetails.get(region) 
    } 
} 

Jetzt Wille wird mein Anrufer ändern

Region china = dock.getShipmentDetailsForRegion ("region") 

Jetzt möchte ich nicht fest einprogrammierte String-Werte in Code einzuführen, da diese Änderung meiner Anrufer beeinflusst Klasse und jetzt ist es die Verantwortung der Anrufer-Klasse, um die richtige Reion zu übergeben, zuvor Dock ausgesetzt Methode für Regionen nur unterstützt.

Gibt es einen Weg zur Kompilierzeit ich muss nicht hardcoded Zeichenfolge verwenden.

+0

Sie können nur Konstanten aus Eigenschaftendateien zur Laufzeit laden, Keine Kompilierzeit beim Laden erlaubt – Sanjeev

Antwort

0

Sie können ein Skript schreiben, das Code mit Enums oder statischen endgültigen Variablen aus einer XML-Datei oder einem anderen Format generiert. Dann führen Sie dieses Skript automatisch während des Erstellungsprozesses aus. Soweit ich mich erinnere, bauen Sie Tools wie Ant kann dies tun.

+0

Es gibt eine leichte Falte mit diesem Ansatz, wir behalten Konfigurationen als separates Projekt und Binärdateien als separates Projekt. Grund ist, wenn es eine Konfigurationsänderung gibt, ändern wir die Konfiguration und geben die Änderungen frei, was kaum 45 Minuten dauert, aber das Löschen von Binärdateien ist ein Längenprozess, den wir nicht wollen, dass wir jedes Mal, wenn wir eine Region hinzufügen wollen, keine freigeben neue Codeversion in der Produktion –

+0

Sie müssen das komplette Projekt nicht neu erstellen, sondern nur die Klassen generieren, die die Konfigurationsinformationen enthalten, und sie ersetzen. –

Verwandte Themen