通过访问器方法封装java.util.Properties访问被认为是不好的做法?

时间:2017-01-27 12:49:12

标签: java encapsulation software-design

我正在使用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实例而不是使用访问器方法吗?还有其他解决方案吗?

3 个答案:

答案 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)等等。