2014-04-01 79 views
1

我有一個SharedFolder類,它實現一個抽象Endpoint類問題涉及到的是獲取類的實例化後更新依賴於其他屬性(environment)的值的子類(baseDir)的屬性之一,這裏就是我說的:我該如何處理這種凌亂的變量陰影?

public class SharedFolderEndpoint extends Endpoint { 

    private String name = "SharedFolder"; 
    private String hostname = "somehostname"; 
    private Environment environment; 
    private String baseDir; 
    private String format = "someformat" 
    private String pattern = "somepattern"; 

    public SharedFolderEndpoint() { 

    } 
    ... 

的BASEDIR路徑取決於環境的價值,變量需要用這樣的初始化:

this.baseDir= "/env-"+this.environment+"/somefolder/files"; 

類由GUI實例化,然後用戶必須選擇他/她想要與之交互的環境,因此,如您所見,在此手動交互之前this.environment引用了null值。

我不知道是否會有一個優雅的解決方案來更新此值,而不創建一個新的方法將值附加到路徑。有任何想法嗎?

+2

這是一個相當開放式的問題,因爲它實際上取決於如何被使用的'baseDir'值。如果它只是很少使用,並且只需要在某個晚些時候有效,那麼就沒有理由不在飛機上進行計算。如果它需要立即生效並使用,則需要一些方法來提供合法的默認值。如果頻繁使用,則只需在需要時計算並保存計算值。根據這些選項,有很多方法可以做到這一點。 – Nate

回答

3

要爲Taks answer(1+)添加一個變體,您可以使baseDir成爲一個「常量格式」字符串構建的「calculated」屬性,以便該字符串的框架可用於快速查看常數是這樣的:

public class SharedFolderEndpoint extends Endpoint { 
    private static final String BASEDIR_FORMAT = "/env-%s/somefolder/files"; 
    //... 


    // might need to declare this as throwing the exception 
    public String getBaseDir() { 
     if (environment.isPopulated()) { 
     return String.format(BASEDIR_FORMAT, environment.toString()); 
     } else { 
     // throw an exception... 
     } 
    } 
} 

這個例子顯示了它剛剛被只用一個字符串變量,%s創建的,但它是微不足道的增加更多。

例如,如果你想使用一個文件夾變量和文件變量,你可以這樣做:

public class SharedFolderEndpoint extends Endpoint { 
    private static final String BASEDIR_FORMAT = "/env-%s/%s/%s"; 
    //... 


    // might need to declare this as throwing the exception 
    public String getBaseDir() { 
     if (!environment.isPopulated()) { 
     // ... throw exception showing no environment 
     } else { 
     if (!folder.isPopulated()) { 
     // ... throw exception showing no folder 
     } else { 
     if (!file.isPopulated()) { 
     // ... throw exception showing no file 
     } else { 
     // throw an exception... 
     return String.format(BASEDIR_FORMAT, 
       environment.getText(), 
       folder.getText(), 
       files.getText()); 
     } 
    } 
} 
2

你可以存儲在單獨的變量的環境和有lazly加載的basedir路徑的方法:

public void setEnvironment(Environment environment) 
    { 
     this.environment=environment; 
     baseDir = null; 
    } 


    public String getBaseDir() { 
     if(baseDir==null) 
      "/env-"+this.environment+"/somefolder/files"; 
     return baseDir 
    } 

如果環境變量將是非常經常改變,你可以使用StringBuilder,並再次緩存值。你也可以使用StringFormat使concat看起來很漂亮。如果SharedFolderEndpoint的一個實例在所有用戶之間共享,則可以創建某種映射userId-> Path。

+0

這工作,但..它的種類在我的API中引入了一個問題,如果有人填充'baseDir'而不是'環境'變量?如果我想在其他地方重複使用此代碼,該怎麼辦? – theMarceloR

+1

如果未設置環境變量,則無法評估baseDir。在這種情況下,你可以有一些默認值或拋出異常或返回null。那裏的行爲完全取決於你。我們在談論什麼樣的重複使用? – Taks

+0

我現在明白你的觀點,謝謝你的回答(+1)。 – theMarceloR