属性键值模式的优点

Advantages of attribute key value pattern

我在 Java class 中遇到过这种模式很多次:

public class MyClass {

    private static final String firstAttributeKey = "FirstAttribute";
    private static final String secondAttributeKey = "SecondAttribute";
    ...

    private String firstAttributeValue = null;
    private String secondAttributeValue = null;
    ...

    public void setProperty(String key, String value) {
        if(key.equals(firstAttributeKey) {
            firstAttributeValue = value;
        } else if(key.equals(secondAttributeKey) {
            secondAttributeValue = value;
        ...
    }

    public void getProperty(String key, String value) {
        if(key.equals(firstAttributeKey) {
            return firstAttributeValue;
        } else if(key.equals(secondAttributeKey) {
            return secondAttributeValue;
        ...
    }

    ...
}

此模式包含一长串键值对。我想知道这种结构的优点是什么。在我看来,简单地创建一个哈希图来存储键值对似乎更容易、更有效。

我发现属性值模式在某些情况下很有用,例如处理聚合和使用集合来存储更新、处理遵循该模式的任何对象的通用 UI,以及 persist/restore。

但是,这里的实施方式似乎有 none 的好处和一些额外的缺点。

首先,你通过if/else ladder 查找属性所属的字段,它很脆弱,计算量大,难以维护。如果你有这样一个通用的 get/set API,你可能想为每个字段补充实际的 accessors/mutators 以及在需要通用使用时保持通用的 get/set .

其次,您根据字符串标识符获取和设置属性,但没有公布标识符是什么,也没有公布它们的含义(它们都是私有的)。除了在整个代码库中复制的字符串常量之外,调用者必须有一种更简洁的方式来协调属性。

第三,如果您不再假设所有属性都是 String 类型,那么您应该向属性添加类型信息,这意味着使用比简单 String 更复杂的对象可以将标识符与数据类型配对。如果您确实假设所有属性都是 String,那么可以限制模式的可用位置。

尽管如此,为了回答您最初的问题,散列图肯定是比 if/else 阶梯更有效和更易于维护的 运行 时间结构。唯一的缺点是 hashmap 可能需要稍微多一点的内存来存储属性名称和实例字段,并且 class 的直接序列化形式将有很大不同。例如,如果您使用某种 JSON 序列化,地图将添加一个层次结构级别,而不是字段,这可能会使持久性和序列化更加复杂。但是对于如此简单的情况,每个字符串字段都映射到一个没有验证的单个属性,hashmap 是更好的选择。