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

标签 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 实例的访问是否被认为是不好的做法?我应该直接使用 Properties 实例而不是使用访问器方法吗?还有其他解决方案吗?

最佳答案

我只想将其更改为使用枚举的单个 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;
    }
}

关于java - 通过访问器方法封装 java.util.Properties 访问被认为是不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41894374/

相关文章:

c++ - 封装与性能

c++ - 从工厂创建的实例访问派生类的成员

ios - VIPER - Interactor 是否应该只返回必要的信息?

java - 我是否过度使用了单例模式?

java - 有选择地拒绝登录用户对操作子集的访问

java - 为什么当我通过 writeObject 方法发送对象时它没有改变?

java - Java中右键复制粘贴

c++ - 在 C++ 中扩展类型

java - 如何在Swing中同步请求焦点?

oop - 为什么封装是 OOP 语言的一个重要特征?