2

I'm receiving from a webservice a list of key-value pairs, and have inherited the following code:

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
            }

            ...

So,except for keeping a hashmap - is there a better way than the above to keep hard coded variables within the class and use this "when-if" pattern.

Also,does this pattern have a name?

4

4 回答 4

4

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

这就像一个策略模式

例如:

  1. 为每个实例实现ENUM一个方法doJob()
  2. 使用valueOf()方法调度作品。

代码示例:

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
}
于 2013-04-25T13:41:11.040 回答
1

如果你想对每个可能的属性值采取不同的行动,恐怕你最终会得到一些关于那个冗长的东西。虽然有一些改进:

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

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

于 2013-04-25T13:42:59.500 回答
1

这种模式有名字吗?

没有。

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

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

... 前提是 ICONS、URL 和其他字符串是编译时常量。

那更简洁,更健壮。它也(可能)更有效,因为切换很可能使用散列来实现。

于 2013-04-25T13:43:26.190 回答
0

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

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

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

于 2013-04-25T13:54:04.627 回答