我该如何处理这个凌乱的变量阴影?

时间:2014-04-01 14:29:20

标签: java oop

我有一个实现抽象SharedFolder类的Endpoint类,该问题与子类(baseDir)的一个属性相关,该属性取决于另一个属性的值(environment)在课程实例化后得到更新,这就是我所说的:

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 个答案:

答案 0 :(得分:3)

要向Taks答案(1+)添加变体,您可以将baseDir设为"计算"从常量格式String构建的属性,以便String的框架可以作为常量快速查看,如:

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

此示例显示仅使用一个String变量%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());
      }
   }
}

答案 1 :(得分:2)

您可以将环境存储在单独的变量中,并且有一个懒惰加载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。