java属性 - 要公开还是不公开?

时间:2010-03-04 16:33:28

标签: java properties

这可能是一个古老的问题,我相信每个人都有自己的方式。 假设我定义了一些属性,例如

secret.user.id=user
secret.password=password
website.url=http://stackoverflow.com

假设我有100个不同的类和位置,我需要使用这些属性。 哪一个好 (1)我创建了一个Util类,它将加载所有属性并使用键常量为它们提供服务 如 : Util是一个单例,可以加载所有属性并保持getInstance()调用。

Util myUtil = Util.getInstance();
String user = myUtil.getConfigByKey(Constants.SECRET_USER_ID);
String password = myUtil.getConfigByKey(Constants.SECRET_PASSWORD);
..
//getConfigByKey() - inturns invokes properties.get(..)
doSomething(user, password)

所以无论我需要这些属性,我都可以采取以上措施。

(2)我创建了一个有意义的类来表示这些属性;说, ApplicationConfig并提供getter以获取特定属性。 所以上面的代码可能如下所示:

ApplicationConfig config = ApplicationConfig.getInstance();
doSomething(config.getSecretUserId(), config.getPassword());
//ApplicationConfig would have instance variables that are initialized during
// getInstance() after loading from properties file.

注意:此类属性文件将来只会进行细微更改。

我个人的选择是(2) - 让我听一些评论?

5 个答案:

答案 0 :(得分:2)

以最直接的方式(具有静态值的类):

package com.domain.packagename

public class Properties {
    private static String hostName;
    public static getHostName() { return hostName; }
    private static int port;
    public static int getPort() { return port; }

    public static void load() {
        //do IO stuff, probably
        hostName = ??;
        port = ??;
        //etc
    }
}

答案 1 :(得分:1)

我发现第一种方法比必要的更冗长。 (特别是如果预期属性不会发生很大变化。)此外,通过使用第二种方法,您可以在加载属性时处理转换/类型问题,而不是在使用它们时处理。

答案 2 :(得分:1)

您的选项(2)保持应用程序特定的getter听起来更好,更干净。 来自接口的公共静态最终密钥在Java中已经很糟糕了。

答案 3 :(得分:0)

我想我的第一个问题是为什么你要创建一个你所说的单例实例(你提到使用像Util.getInstance()这样的代码)。单例只有1个实例,因此您不应该尝试在代码中实例化多个副本。

如果数据是静态的(就像这样),我会创建一个单例并从中检索值。

答案 4 :(得分:0)

我不认为一种方法相对于另一种方法有任何明显的优势,我不认为解决方案(1)更安全,因为它提供了一个属性键而不是java getter来获取密码。

如果我必须选择一个,我会选择(2)。