2010-03-04 250 views
5

这可能是一个古老的问题,我相信每个人都有自己的方式。 假设我有一些属性定义,如java属性 - 暴露还是不暴露?

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) - 让我听听一些评论?

+0

无论如何您不会缓存属性,所以如果您在几个不同的地方加载它,性能会受到影响吗? – willcodejavaforfood 2010-03-04 17:09:10

+0

为什么使用锅炉板?我不这是一个很好的建议。 另请注意,我用程序设计标记了这一点。我喜欢代码运行良好,并且能够很好地阅读。 – 2010-03-04 17:12:24

回答

1

我觉得第一种方法会比需要的更详细。 (尤其是如果这些属性预计不会有太大变化)。另外,通过使用第二种方法,您可以在属性加载而不是使用它们时处理加载/类型问题。

+0

喜欢铸造点。 – 2010-03-04 20:28:16

0

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

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

+1

*是您访问单例实例的方式之一。 – alphazero 2010-03-04 16:52:31

+0

同意,Util.getInstance()。whateverMethod .. 就足够了。创建的副本(如果我真的只是为了清晰的代码) 但你的答案并不完整。在这两种情况下,我都有单身。问题在于是否使用基于常量KEY的方法或者为将提供获取者的类别建模 – 2010-03-04 16:52:32

0

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

如果我不得不选择一个,但我会选择(2)。

+0

hm ..我认为 myUtil.getConfigByKey(Constants.SECRET_PASSWORD); 是安全的或(对于那件事更少)为: config.getPassword() – 2010-03-04 17:18:31

+1

同意它是安全的(或更少)。如果myUtil编写得很好,JVM安全性得到增强(以防止私有变量的反射/检查),那么它可能*相当*安全 – 2010-03-04 19:30:44

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,因为这是一个很好的想法。可以创建一个不可变类来表示属性,例如: public class Configuration public final String userId; public final String password; public final int timeOut; private static Configuration CONFIG = null; 专用配置(属性道具){// 代码来填充最终变量 //一些单身天书 } 公众的getInstance(){// ... } – 2010-03-04 20:31:37

1

您的选择(2)让应用程序特定的getter听起来更好,更干净。 来自界面的公共静态最终键在Java中已经是一个糟糕的设计了。

+0

是的!我也不喜欢来自界面的公共静态最终键 – 2010-04-16 21:29:42