通过访问器方法封装java.util.Properties访问被认为是错误的做法?
我正在使用通过访问器方法封装java.util.Properties访问被认为是错误的做法?,java,encapsulation,software-design,Java,Encapsulation,Software Design,我正在使用java.util.Properties进行一个项目。我有一个类,它管理一个.properties文件和一个名为PropertiesManager的PropertiesManager实例。此类管理从光盘加载和保存.properties文件 现在,因为我想确保只能访问有效的属性,并且在文件中没有属性时使用默认值,所以我为文件的每个属性添加了getter和setter 问题是这使得类属性管理器非常大。仅getter和setter(带注释/空行)就有300行代码。因此,即使我将加载/保存转移
java.util.Properties
进行一个项目。我有一个类,它管理一个.properties文件和一个名为PropertiesManager
的PropertiesManager实例。此类管理从光盘加载和保存.properties文件
现在,因为我想确保只能访问有效的属性,并且在文件中没有属性时使用默认值,所以我为文件的每个属性添加了getter和setter
问题是这使得类属性管理器非常大。仅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实例的访问是否被认为是错误的做法?我应该直接使用Properties实例而不是使用accessor方法吗?还有其他解决方案吗?我只想将其更改为使用枚举的单个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;
}
}
将您的访问封装到
像这样的例子?我应该只使用属性吗
直接引用而不是使用访问器方法?还有别的吗
解决方案
作为解决方案,它相当麻烦。
我认为,如果您使用包含键的所有默认值的属性文件(如果未提供默认值,则应使用默认值),那么它将更易于维护和可读
此解决方案的优点是不需要修改代码来更改默认值。您只需更改应用程序打包之外的默认属性文件。
在PropertiesManager
wrapper类中,提供一个类似于Properties
类的getProperty()
方法的public String getProperty(字符串键)
方法,如果有效属性文件中未提供该值,如果默认属性文件在中存在,请使用默认属性文件返回默认值
public String getProperty(String key) {
String value= properties.getProperty(key);
if (StringUtils.isEmpty(value)){
value= propertiesDefault.getProperty(key);
}
return value;
}
对于setProperty()
方法,您可以依赖相同的逻辑。封装属性
实例是有意义的。您想要公开的是委托给底层属性的某个实例。我建议您列举所有受支持的项目,以减少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)
等等。Jesus!同样的想法,我只是太慢了:(谢谢你的回答!这个解决方案满足了我所有的要求,非常优雅!同样感谢你:谢谢你的回答!这个解决方案满足了我所有的要求,非常优雅!不用担心:)(填充,15个字符)谢谢你的想法。我想我会使用enum变量,这是在另外两个答案中提出的,因为它确保只有有效的密钥可以用作参数。感谢您的反馈:)