我的头脑因为想到以下问题的优雅解决方案而受到伤害。我有一个父类和几个子类。我的父类声明并实现了一个检索属性的方法,但属性文件的名称由子类决定。
我只使用子类的实例。
该方法(在父实现中)应该使用子类的字段值,但由于我在父类中使用它,我也需要在那里声明它。
现在,每次从子类调用该方法时,都会使用父类的字段值。
一些简单的代码来说明我的问题(请记住:它不是关于功能 - 更多关于设计)。定义我想要使用的字段值的子类:
public class SubClass extends Parent {
public static final String CONFIG_FILE = "subclass.properties"; // same problem with non-static
public SubClass() {
System.out.println(getProperty("somekey"));
}
}
以及定义和实现我想要使用的方法的父类:
public class Parent {
public static final String CONFIG_FILE = "config.properties"; // same problem with non-static
public String getProperty(String key) {
Properties props = new Properties();
try {
props.load(new FileReader(new File(CONFIG_FILE)));
}
catch (IOException ioe) {
return null;
}
return props.get(key);
}
由于我从子类调用getProperty(..)
,我希望它使用它正在运行的实例的字段值(“subclass.properties”),而是使用父字段值( “config.properties”)。我对非静态字段的效果相同。
答案 0 :(得分:3)
查看代码,您正在使用Parent.CONFIG_FILE
,在子类中应使用SubClass.CONFIG_FILE
答案 1 :(得分:2)
将它放在您的子类中。然后,这将返回子类的属性。此方法将覆盖父类中的方法。
public String getProperty(String key) {
return CONFIG_FILE;
}
你很容易shadowing变量。
或者我建议将变量名称传递给构造函数,然后让它调用super。
public SubClass() {
super(SUB_CLASS_CONFIG);
}
然后让Parent construtor像
public Parent(String key) {
CONFIG_FILE = key;
}
然后你不必重写方法。该方法只能在父级中返回config。我会仔细考虑你是否希望它是静态的......
答案 2 :(得分:1)
在子类中覆盖(即实现)getProperty()
。