2016-04-23 3 views
0

Я работаю над Java-приложением, в котором мы получаем xml, xml содержит некоторые данные из многих регионов по всему миру. Итак, xml выглядит примерно так:Загрузка констант времени компиляции из файла свойств

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

У нас есть одно pojo под названием Dock.

public class Dock { 

    private Map<SupportedRegion, Region> regionalShipmentDetails = // 
    //some field and getter setter. 
    getChinaShipmentDetails() { this.regionalShipmentDetails.get(SupportedRegions.CHINA)} 
    setChinaShipmentDetails (Region china) { 
     this.regionalShipmentDetails.get(SupportedRegions.CHINA).add(china) 
    } 

    getRussiaShipmentDetails() {//same for russia} 
    setRussiaShipmentDetails (Region russia) {same for russia} 
} 

Мы извлекаем регион из этого xml, создаем объект области и добавляем объект Dock. Теперь мы также поддерживаем перечисление, которое определяет все, что поддерживается нашим приложением.

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

Теперь мы получаем требование поддерживать другие регионы. Теперь мы хотим реорганизовать наш код, чтобы он стал легким и настраиваемым для поддержки регионов командой поддержки.

Мы хотим переместить его из кода и сохранить в файле свойств с минимальными изменениями. У нас есть код вызова.

dock.getChinaShipmentDetails() 
dock.getRussiaShipmentDetails(). 

Теперь, если я удаляю перечисление и перемещаю все области в свойствах. Мне придется изменить свой класс Dock к чему-то вроде этого

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

Теперь мой вызывающий абонент становится

Region china = dock.getShipmentDetailsForRegion ("region") 

Теперь я не хочу, чтобы ввести жёстко прописанные значения строк в коде, так как это изменение влияет на мое вызывающему класса, и теперь его ответственность за класс вызывающего абонента передается правильному reion, ранее Dock был подвержен методу только для поддерживаемых регионов.

Есть ли какой-либо способ во время компиляции, я не должен использовать hardcoded string.

+0

Вы можете загружать константы из файлов свойств во время выполнения, без возможности загрузки времени компиляции – Sanjeev

ответ

0

Вы можете написать сценарий, который генерирует код с перечислениями или статическими конечными переменными из файла XML или другого формата. Затем вы запускаете этот скрипт автоматически во время процесса сборки. Насколько я помню, такие инструменты, как Ant, могут сделать это.

+0

есть небольшая морщина с этим подходом, мы сохраняем конфигурации как отдельный проект и двоичные файлы как отдельный проект. Причина в том, что если есть изменение конфигурации, мы меняем конфигурацию и освобождаем изменения, которые занимают едва 45 минут, но выпуск двоичных файлов - это процесс длины, мы не хотим, чтобы каждый раз, когда мы хотим добавить регион, мы не должны выпускать новая версия кода на производстве –

+0

Вам не нужно перестраивать полный проект, просто сгенерируйте классы, содержащие информацию о конфигурации и замените их. –

Смежные вопросы