我与同事就下列问题进行了讨论:
我们的项目读入配置文件并存储了许多参数。他将这些数据与每个变量的几十个getter方法一起存储在命名变量中。在我看来,这使得班级过度使用getter方法并且难以维护。
private var;
public String getVar() {
return var;
}
// This appears dozens of times in the class
......
我的解决方案是将键值对存储在映射中,并使用单个getValue(String key)方法,该方法将表示每个变量的键作为参数。密钥将作为常量列表存储在Config类中,该类还将处理从文件中读取数据。
Config c = new Config();
c.readConfig(someFile);
...
c.getValue(Config.SOME_VAR);
他反对我的设计的论点是,如果任何密钥需要改变或被淘汰,那么密钥的所有实例都必须在源代码的许多地方被追捕和更改,而在他的设计中,一切都是从1个档案。此外,类型安全性存在问题,因为从getValue()返回的String中的Integer.parseInt()可能会崩溃,而在他的方法中,返回类型是固定的。
有关上述内容的任何评论?感谢。
答案 0 :(得分:4)
他的解决方案难以维持什么?除非配置格式发生变化,否则我不会预见到任何维护(尽管总是可能出现意外)。如果需要维护,我认为这个解决方案会更容易,因为所有相关的解析(包括string-> int等)都在一个地方。
他的编译时检查要好得多。如果删除方法,编译器会告诉您。如果将返回值分配给错误的类型,编译器将告诉您。
答案 1 :(得分:1)
假设您在配置文件中维护数据是正确的,这些变量的值是固定的。如果是这样,你可以不使用ENUM吗?
public enum Data {
RED("red"),
WHITE("white");
private String color;
private Data(String color){
this.color = color;
}
public String getColor(){return color;}
}
如果您尝试更多地考虑设计,您甚至可以设法使用不同的数据类型。
答案 2 :(得分:0)
我倾向于使用Apache Commons Configuration之类的框架来提供对属性的类型访问。例如,如果您有一个int属性,则可以使用:
int number = config.getInteger(INT_PROPERTY);
您应该在一个地方定义所有密钥,这样如果您决定更改密钥,您只需在一个地方更改密钥。例如:
public static final String DB_PASSWORD = "db_connection_password";
要获得财产使用:
String password = config.get(DB_PASSWORD);
如果您决定将密钥更改为db_passwd
,则只需更改DB_PASSWORD
常量的值。其余代码保持不变。