我正在使用java.util.Properties
来处理我正在进行的项目。我有一个类,它管理一个带有Properties
实例的.properties文件,名为PropertiesManager
。此类管理从光盘加载和保存.properties文件。
现在因为我想确保只能访问有效的属性,并且只要文件中没有属性就使用默认值,我为文件的每个属性添加了getter和setter。
问题是使班级PropertiesManager
非常大。单独的getter和setter(带注释/空行)是300行代码。因此,即使我将加载/保存转移到另一个类(继承等),它仍然是大的。
这不是实际的代码,但它给你的想法:
import java.util.Properties;
public class PropertiesManager {
private Properties properties;
public PropertiesManager() {
// constructor
}
private void save() {
// save in .properties file
}
private void load() {
// load from .properties file
}
public String getPropertyName1() {
return properties.getProperty("PropertyName1", "Property1DefaultValue");
}
// 28 more getters here
public String getPropertyName30() {
return properties.getProperty("PropertyName30", "Property30DefaultValue");
}
public void setPropertyName1(String value) {
properties.setProperty("PropertyName1", value);
}
// 28 more more setters here
public void setPropertyName30(String value) {
properties.setProperty("PropertyName30", value);
}
}
将这样的访问权限封装到这样的属性实例中,这被认为是不好的做法吗?我应该直接使用Properties实例而不是使用访问器方法吗?还有其他解决方案吗?
答案 0 :(得分:5)
我只是将它改为使用枚举的单个getter / setter:
public class PropertiesManager {
...
public String getProperty(EnumProp enumProp) {
return properties.getProperty(enumProp.getKey(), enumProp.getDefaultValue());
}
public void setProperty(EnumProp enumProp, String value) {
properties.setProperty(enumProp.getKey(), value);
}
}
有了这个枚举:
public enum EnumProp {
PROP_1("key", "defaultValue"),
...
EnumProp(String key, String defaultValue){
this.key = key;
this.defaultValue = defaultValue;
}
}
答案 1 :(得分:1)
将您的访问权限封装起来被认为是不好的做法 像这样的属性实例?我应该只使用属性 实例直接而不是使用访问器方法?还有另一个吗? 溶液
解决方案相当麻烦。
我认为如果你使用包含键的所有默认值的属性文件,如果没有提供默认值,那么它将更易于维护和读取。
此解决方案的优点是您无需修改代码即可更改默认值。您只需更改可能位于应用程序打包之外的默认属性文件。
在RewriteRule ^topic/topic1/(.*) topic1/$1 [L]
包装器类中,提供PropertiesManager
方法类似于public String getProperty(String key)
类的getProperty()
方法,如果有效属性文件中未提供该值,使用默认属性文件返回默认值(如果它存在于。
Properties
您可以依赖public String getProperty(String key) {
String value= properties.getProperty(key);
if (StringUtils.isEmpty(value)){
value= propertiesDefault.getProperty(key);
}
return value;
}
方法的相同逻辑。
答案 2 :(得分:1)
有意义封装Properties
实例。您想要公开的内容是委托给底层Properties
实例的事物的实例。我建议你枚举所有支持的原则,以减少PropertiesManager
的公共接口:
public class PropertiesManager {
public enum Property {
SOMETHING("PropertyName1", "PropertyName1DefaultValue"),
ANOTHER("PropertyNameX", "PropertyNameXDefaultValue"),
…;
public final String key;
public final String defaultValue;
Property(String key, String defaultValue) {
this.key = key;
this.defaultValue = defaultValue;
}
}
private Properties properties;
public PropertiesManager() {
}
private void save() {
// save in .properties file
}
private void load() {
// load from .properties file
}
public String get(Property property) {
return properties.getProperty(property.key, property.defaultValue);
}
public void set(Property property, String value) {
properties.setProperty(property.key, value);
}
}
现在您只需调用propertyManager.get(SOMETHING)
等等。