【问题标题】:Advantages of attribute key value pattern属性键值模式的优点
【发布时间】:2015-08-27 00:35:40
【问题描述】:

我在 Java 类中多次遇到这种模式:

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;
        ...
    }

    ...
}

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

【问题讨论】:

  • 所以你只存储两个值,不是吗?并且键始终应该是 FirstAttribute 和 SecondAttribute 以在您的结构中存储值
  • ...这只是一个sn-p。可能有 40-50 个属性,所有属性都有一个键和值声明,以及一个 set 和 get 语句。我不明白你为什么想要这样的实现
  • 也许这段代码的作者根本不了解地图并试图重新发明轮子?或者它是一些(可能是被误导的)优化性能的尝试。
  • 在我看来,使用这种方法而不是 HashMap 简直是疯了。我看到这可能提供的唯一好处是控制允许的键 - 但即使使用 HashMap 也有更好的方法来实现这一点。 (我假设 void getter 是一个错字。)

标签: java hashtable


【解决方案1】:

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

但是,这里的实现方式似乎没有任何好处,还有一些额外的缺点。

首先,通过 if/else 阶梯查找属性所属的字段,该阶梯易碎、计算量大且难以维护。如果您有这样一个通用的 get/set API,您可能希望为每个字段补充实际的访问器/修改器,并在需要通用使用时维护通用的 get/set。

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

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

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

【讨论】:

    猜你喜欢
    • 2021-02-19
    • 1970-01-01
    • 2017-12-14
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多