2013-08-15 2 views
1


У меня есть программа, которая загружает в основных свойствах класса из config.properties файла, как это:Как загрузить свойства из config.properties в многопоточной среде в JAVA

public class DirectoryWatcher { 
     public static String FOLDER = null; 
     Properties prop = new Properties(); 

     prop.load(new FileInputStream(new File(configPath))); 
     FOLDER = prop.getProperty("FOLDER"); 
    }   

Многих нитей необходима ПАПКА, из-за него Я установил его как public static, поэтому потоки могут его использовать.

Я не такой, как программирование, и я ищу некоторые примеры передовой практики.
Можете ли вы предложить мне что-то лучшее? Спасибо.

+0

Лучшей практикой является использование соглашений об именах Java. –

+0

Вам не нравится FOLDER в верхнем регистре? – prilia

+0

Мне нравится быть окончательным. –

ответ

1

Для меня это было бы достаточно просто

public class DirecoryWatcher{ 
    private static String FOLDER; 

    public static synchronized getFolder(){ 
     if(FOLDER == null){ 
      // FOLDER = your loading code 
     } 
     return FOLDER; 
    } 
} 

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

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

Вы также можете сделать этот подход доступным для чтения любого свойства, указанного в качестве аргумента. Я жестко закодировал FOLDER ради ясности.

public class DirectoryWatcher{ 

    private static Map<String,String> properties = new HashMap<String,String>(); 

    public static synchronized getValueFor(String prop){ 
     String result = null; 
     if(!properties.keySet().contains(prop)){ 
      result = // your loading code 
      properties.put(prop, result); 
     }else{ 
      result = properties.get(prop); 
     } 
     return result; 
    } 
} 

Этот код предоставит вам защиту от потоков и поддержку для любого заданного количества свойств. Это также улучшает инкапсуляцию вашего кода, вы можете добавить к нему некоторую логику (вы не просто просматриваете содержимое своего файла).

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

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

+0

И если у вас есть атрибуты свойств в конфигурации, которые вам нужны во всех потоках? – prilia

+0

Хорошо, я добавлю реализацию для поддержки любого заданного количества свойств. – Augusto

+0

@prilla, представьте длину кода, если вы должны загружать свойства по одному ... – Augusto

1

Вы можете сделать окончательный:

private static final Properties prop = new Properties(); 
public static final String FOLDER; 

static { 
    try { 
     prop.load(new FileInputStream(new File(configPath))); 
    } catch (IOException ex) { 
     //outch => log and exit? 
    } 
    FOLDER = prop.getProperty("FOLDER"); 
} 

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

1

Возможно, вы можете использовать Singleton pattern для решения этой проблемы?

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

1

можно определить простой читатель файла свойство, как этого

public class LoadDataFromPropertiesFile { 

public final static Properties loadPropertiesFile(String fileName) { 
    ClassLoader loader = Thread.currentThread().getContextClassLoader(); 
    InputStream inStream=null; 

    try { 
     inStream = loader.getResourceAsStream(fileName); 
     if (inStream == null) { 
      throw new RuntimeException("Couldn't find " + fileName + "in class path"); 
     } 
     Properties prop = new Properties(); 
     prop.load(inStream); 

     return prop; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     throw new RuntimeException(e); 
    }finally { 
     if (inStream != null) { 
      try { 
       inStream.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
       throw new RuntimeException(e); 
      } 
     } 
    }  
} 
} 

конкретных файлов свойств можно прочитать, как показано ниже.

public class DirectoryWatcher { 
public static final Properties directoryWatcher; 
static { 
    directoryWatcher =  LoadDataFromPropertiesFile.loadPropertiesFile("config.properties"); 
}  

}

Свойства можно определить как тип ENUM ...Вы можете перечислить свои свойства здесь

public enum DirectoryProperties { 
     FOLDER("FOLDER","Directory Type Folder"), 
     IMAGE("IMG","Image File"); 
; 

DirectoryProperties(String code, String description) { 
    this.code = code; 
    this.description = description; 

} 

public String getCode() { 
    return code; 
} 

public String getDescription() { 
    return description; 
} 

private String code; 
private String description; 

}

Вы можете использовать свои свойства в любом потоке. например

DirectoryWatcher.directoryWatcher.getProperty(DirectoryProperties.FOLDER.getCode()); 

Вы можете использовать описание, если требуется.

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