У меня есть серия свойств приложения, которые у всех есть различные типы.
Типы могли включать, булевские переменные, даты, метки времени или строки.
Я должен смочь обеспечить способность к административным пользователям измениться, эти свойства и иметь систему для запоминания / сохраняют их в файл.
Я ищу лучшую практику способ сохранить эти свойства приложения и смочь сохранить их на изменении и загрузить их на запуске.
Сообщение из будущего: ссылка уже мертва.
В Java есть средство, созданное специально для этой цели - Свойства. Вот очень хорошая статья об этом
https://docs.oracle.com/javase/tutorial/essential/environment/properties.html
Предполагая, что вы используете Java, взгляните на Apache Commons DatabaseConfiguration ( http://commons.apache.org/configuration/apidocs/org/apache/commons/configuration/DatabaseConfiguration .html ).
По сути, то, что он делает, довольно просто. Он сканирует таблицу, содержащую пары ключ-значение, и представляет эту таблицу как java.util.Properties. Вы можете использовать это для загрузки свойств вашего приложения из базы данных.
После загрузки вы можете кэшировать эти свойства в своем приложении. Не забывайте аннулировать этот кеш всякий раз, когда вы вносите изменения в свойства приложения.
Поскольку у вас есть потребность в хранении и чтении различных свойств различных типов, таких как логические, целые числа и т. Д., Я считаю, что API java.util.prefs
- хороший выбор для тебя. Он позволяет хранить и читать различные типы данных.
Вот документация API
Я использую этот код, и он у меня работает неплохо (только частичный код, кодирование из памяти ..): (Он используется вместе с классом свойств java, но упрощает добавление свойств и синхронизацию шаблона файла свойств.)
to use:
Date date = Conf.value(Prop.SOME_DATE,Date.class);
,
enum Prop {
SOME_DATE(Date.class, "2009-10-28", "Some date"){
Object parse(String value){
return new Date(value);
}};
private final Class<?> type;
private final String description;
private final Object default;
Properties(Class<?> type, String defaultValue, String desc){
this.type = type;
this.description = desc;
this.default = this.parse(defaultValue);
}
abstract Object parse(String value);
}
и
class Conf {
private static final String PROP_FILE_NAME = "some.properties";
private volatile Map<Prop,Object> store;
public void load(){
//Read from property file and use default if not given.
//I code it in a way that it will not permit null as value, so
//if default is null the user is forced to provide setting.
}
public <T> T value(Prop prop, Class<T> clazz){
return (T)this.store.get(prop);
}
public static void main(String[] args){
//code to autogenerate property file
//Something like:
//#Default : 2009-10-28 Description : Some date. Type:Date
//#SOME_DATE=2009-10-28
}
}
Аргумент класса делает метод немного многословно, но иногда раздражает, если вы можете позволить java вывести только тип, например:
CountDownLatch latch = Conf.value(Prop.SOME_INTEGER);
//Compilation error! Since it expects int and won't unbox.
CountDownLatch latch = Conf.value(Prop.SOME_ITEGER,Integer.class);
//Verbose, but works everytime. Of course you could get a
//ClassCastException, but you should notice that early
//in the development...
Вы можете хранить их в своей базе данных, однако из-за разницы в типах данных ваших свойств вам придется хранить их в их строковом представлении. Вы можете использовать другой столбец, чтобы указать, возможно, тип данных .
Эту форму параметризации приложения вы успешно использовали в моей работе. Это общая идея, я хо pe вы можете прийти к своему решению с этим.
java.util.Properties
- самый простой способ. Объект Properties
может быть создан из файла свойств (файла, содержащего свойства в формате name = value
) или даже из простого файла XML. Вы можете изменить объект в памяти, а затем записать его обратно в файл свойств или XML.
Если вам нужна большая гибкость в структурировании свойств, вы можете подумать о создании собственного XML-файла конфигурации , хотя для чтения и записи потребуется немного больше работы. Однако вы можете использовать API маршалинга / демаршалинга, например JAXB, XStream и т. Д., Чтобы упростить эту задачу.
Эти файлы также можно легко изменить вручную.
Вы можете использовать SQLite Firefox использует его для сохранения свойств
Несмотря на то, что вы должны использовать Preferences API или Properties, вот хак, который также может сработать:
Создайте HashMap
и используйте XMLEncoder/XMLDecoder для сохранения/загрузки. Большинство стандартных классов java могут быть сериализованы таким образом как java beans. Вы можете создать простой класс-обертку для получения различных свойств, обработки значений по умолчанию и т.д. Таким образом можно также хранить вложенные коллекции, что иногда очень удобно. Это очень просто реализовать.