2010-03-04 169 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