什么是保持应用程序属性的好方法?

我有一系列应用程序属性,它们都有不同的类型。

类型可以包括布尔值,日期,时间戳或字符串。

我需要能够为管理用户提供更改这些属性的能力,并让系统记住/将它们保存到文件中。

我正在寻找一种最佳实践方法来存储这些应用程序属性,并能够在更改时保留它们并在启动时加载它们。

来自未来的消息:链接已经死亡。

Java有专门为此目的而构建的工具 – 属性。 这是关于它的非常好的文章

https://docs.oracle.com/javase/tutorial/essential/environment/properties.html

由于您需要存储和读取不同类型的各种属性,如布尔值,整数等。我认为java.util.prefs API是一个不错的选择。 它允许您存储和读取各种数据类型。

这是API文档

java.util.Properties是最简单的方法。 可以从属性文件(包含格式为name=value的属性的文件)甚至是简单的XML文件创建Properties对象。 您可以修改内存中的对象,然后将其写回属性或XML文件。

如果在构造属性时需要更多的灵活性,可以考虑设计自己的XML配置文件 ,尽管读取和写入会更多。 但是,您可以使用JAXB,XStream等编组/解组API来简化该任务。

这些文件也可以手动修改。

假设您使用的是Java,请查看apache commons DatabaseConfiguration( http://commons.apache.org/configuration/apidocs/org/apache/commons/configuration/DatabaseConfiguration.html )。
基本上,它的function非常简单。 它扫描具有键值对的表,并将该表公开为java.util.Properties。 您可以使用它从数据库加载应用程序属性。
加载后,您可以在应用程序中缓存这些属性。 每当您更改应用程序属性时,请记住使此缓存无效。

我使用这个代码,它对我来说非常好(只有部分代码,从内存编码..):(这与java的Properties类一起使用,但它更容易添加属性并保留属性文件模板同步中。)

 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 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 value(Prop prop, Class 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 } } 

class参数使得该方法有点冗长,但有时如果你只能让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... 

您可以将它们存储在数据库中,但是由于属性的数据类型不同,您必须将它们存储在String表示forms中。 您可以使用另一列来指定数据类型。

这种forms的应用程序参数化是您在我的工作中成功使用的。 这是一般的想法,我希望你能用这个来达到你的解决方案。

您可以使用SQLite Firefox使用它来持久保存属性

即使您应该使用Preferences API或Properties,这里也可以使用hack:

创建HashMap并使用XMLEncoder / XMLDecoder进行保存/加载。 大多数标准java类都可以像java bean一样序列化。 您可以创建一个简单的包装类来获取各种属性,处理默认值等。这样您还可以存储有时候方便的嵌套集合。 这很容易实现。