我有一个 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
值。
我想知道是否有一个优雅的解决方案来更新这个值而不创建一个新的方法来将值附加到路径。有什么想法吗?
最佳答案
要向 Taks 答案添加变体(1+),您可以使 baseDir 成为从常量格式字符串构建的“计算”属性,以便字符串的骨架可作为常量快速查看,类似于:
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());
}
}
}
关于java - 我如何处理这个困惑的变量阴影?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22788894/