这种设计(或反)模式是什么,更重要的是有更好的方法吗?

时间:2013-04-25 13:36:48

标签: java design-patterns

我从webservice收到一个键值对列表,并继承了以下代码:

public String iconValue = null;
... (over 50 class variables assigned in MyObject constructor below)

public MyObject(List<Attribute> attrs) {

    String attrName, attrValue;

    for (Attribute a : attrs) {
        try
        {
            attrName = a.getName();
            attrValue = a.getValue();

            if (attrValue == null || "".equals(attrValue.trim()))
                continue;

            if (ICONS.equals(attrName)) {
                //Do something including assignment
                this.iconValue = attrValue;
            }
            else if (URL.equals(attrName)) 
            {
                //Do something including assignment
            }
            else if (...)  A giant list of over 50 different attributes hardcoded
            {
                //Do something including assignment
            }

            ...

因此,除了保留一个hashmap之外,还有一种比上述方法更好的方法是将硬编码变量保留在类中并使用这种“if-if”模式。

此外,这种模式有名字吗?

4 个答案:

答案 0 :(得分:4)

我可以考虑的一种方法是使用ENUM并动态地将工作分配给每个ENUM对象,而不是做一个巨大的if else,尤其是。因为ENUM可以通过他们的名字来查找。

那就像strategy pattern

例如:

  1. 为每个实例实施ENUM以获得方法doJob();
  2. 使用valueOf()方法发送作品。
  3. 代码示例:

    public enum Strategies {
        URL {
            @Override
            public void doJob(MyObject mo) {
                    // do the work
            }
        },
        ICONS {
            @Override
            public void doJob(MyObject mo) {
                    // another work
            }
        };
        public abstract void doJob(MyObject mo);
    }
    

    使用时,

    try {
        Strategies.valueOf(attrName).doJob();
    } catch (IllegalArgumentException e) {
        // ENUM does not exist, illegal parameter
    }
    

答案 1 :(得分:1)

如果你想对每个可能的属性值采取不同的行动,你会得到关于那个冗长的东西,我很害怕。但有些改进:

如果您使用的是Java7或更高版本,现在可以使用带有字符串的switch语句(link

如果不是,您可以创建一个具有静态方法的枚举,该方法返回您可以打开的Enum元素。它没有性能提升,但它可能有助于提高代码的可读性。

答案 2 :(得分:1)

  

此模式是否有名称?

不。

在Java 7中,您可以将其表达为:

  switch (attrName) {
  case ICONS:
      //Do something including assignment
      break;
  case URL: 
      //Do something including assignment
      break;
  // and so on
  }

...假设ICONS,URL和其他字符串是编译时常量。

这更简洁,更健壮。它(也可能)更有效,因为交换机最有可能使用散列来实现。

答案 3 :(得分:0)

我认为它没有名称,但你可以称之为“使用多态性错误”(如果类型安全是一个问题)。这取决于您是否有明确的数据合同。您收到的数据是正确的对象,还是“随机”数据?

如果它是一个合适的对象,我会创建一个具体的表示,并使用像Dozer这样的东西(或者如果你不想被依赖关系捆绑,使用反射滚动你自己的映射器)来在它们之间进行转换。

如果它或多或少是随机数据,我只使用Map或类似的数据结构。