1


我有从文件 config.properties 加载主类属性的程序,如下所示:

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

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

许多线程需要 FOLDER,因此我将其设置为public static,因此线程可以使用它。

我不喜欢这种编程,我正在寻找一些最佳实践实现。
你能给我推荐一些更好的吗?谢谢你。

4

4 回答 4

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

此代码将为您提供线程安全性并支持任何给定数量的属性。它还增强了代码的封装,您可以为其添加一些逻辑(您不仅仅是公开文件的内容)。

此外,在这种情况下,直到第一次需要属性才会加载。如果从未使用过某个属性,则不会读取该属性。这提高了您的内存使用率,您不会在不需要的值上浪费内存。

要考虑的另一件重要事情是,通过此实现,您的属性加载器类可以非常轻松地处理错误和异常。使用另一种方法,您将处理问题的责任委托给请求该属性的对象。

于 2013-08-15T11:27:02.040 回答
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");
}

这将确保它在任何线程中都是可见的。如果您有多个属性,您还可以使用这个使用枚举并且是线程安全的示例。

于 2013-08-15T11:34:51.710 回答
1

也许你可以使用单例模式来解决这个问题?

如果您有大量要加载的信息,您也可以对文件夹使用延迟加载。

于 2013-08-15T12:21:01.240 回答
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());

您可以在需要时使用描述。

于 2013-08-15T13:25:58.593 回答