通过访问器方法封装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变量,这是在另外两个答案中提出的,因为它确保只有有效的密钥可以用作参数。感谢您的反馈:)