我想知道是否有更好的方法在属性文件中指向PATH。请考虑以下代码:
public class Properties
{
//MIKE
public final static String PATH_TO_FILE_A = "C:\\programmer_MIKE\fileA.txt";
public final static String PATH_TO_FILE_B = "C:\\programmer_MIKE\fileB.txt";
//BILL
//public final static String PATH_TO_FILE_A = "/Users/BILL/Desktop/fileA.txt";
//public final static String PATH_TO_FILE_B = "/Users/BILL/Desktop/fileB.txt";
}
当任何开发人员需要调用FILE_A时,他只需执行:
File file = new File(Properties.PATH_TO_FILE_A);
如果BILL注释掉了MIKE的PATH_TO_FILE_A,这对BILL来说还可以。
问:有更好的设计吗?如果BILL承诺他的工作包括属性文件 - 他将给MIKE带来问题(不用担心,他以后会得到一杯咖啡拿铁)。
感谢任何指针!
答案 0 :(得分:2)
如果出于某种原因你必须拥有硬编码路径,那么你可以将它们存储在某种由用户名索引的地图中。类似的东西:
public class Properties {
private static Map<String, DeveloperPaths> properties = create();
private static Map<String, DeveloperPaths> create() {
Map<String, DeveloperPaths> properties = new HashMap<String, DeveloperPaths>();
properties.put("mike", new DeveloperPaths(
"C:\\programmer_MIKE\fileA.txt",
"C:\\programmer_MIKE\fileB.txt")
);
properties.put("bill", new DeveloperPaths(
"/Users/BILL/Desktop/fileA.txt",
"/Users/BILL/Desktop/fileB.txt")
);
return properties;
}
public static File FileA()
{
String user = System.getProperty("user.name");
return properties.get(user).fileA;
}
public static File FileB()
{
String user = System.getProperty("user.name");
return properties.get(user).fileB;
}
}
class DeveloperPaths {
public File fileA;
public File fileB;
public DeveloperPaths(String pathA, String pathB) {
fileA = new File(pathA);
fileB = new File(pathB);
}
}
然后,无论开发人员如何,访问每个路径的代码都是相同的,例如:
File myFile = Properties.fileA();
答案 1 :(得分:1)
通常路径是可配置的,应该存储在属性文件中。
属性文件在java中具有内置支持,它使用Properties对象来存储该信息。
您可以在应用程序的启动或init(或类似)方法中读取属性文件,并从属性文件中读取proeprties。这将使您的配置动态化,任何人都可以更改它。
您可以创建静态方法并在启动时调用它,如:
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class GetProperties {
public static Properties prop = new Properties();
public static void init() {
InputStream inputStream = GetProperties.class.getClassLoader().getResourceAsStream("application.properties");
try {
prop.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
}
答案 2 :(得分:0)
这样的事情应该在外部配置和/或通过参数,系统参数或环境变量传递。或者你可以使用DI / IoC,但是当没有附加行为时,IMO配置值就足够了。
没有硬编码的默认值,但是其他类似的东西不属于代码。