JavaBean设置属性。多个if语句替代方案

时间:2011-12-02 08:38:15

标签: java refactoring javabeans

我想再次就设计问题发表意见。

我有一个包含15个属性的JavaBean。为了提供属性,我有一个 for循环,它遍历一组键值对(具体来说是SAML属性,我将属性响应映射到主体属性)。我在键值上调用了适当的 setter 方法,这是:

    .../...
    for (SAML2AttributeInfo attr : attrs) {
        if (attr.getAttributeName().equals("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn")) {
            customPrincipal.setUpn(attr.getAttributeValues().iterator().next());
        }
        .../... so on and so forth
    }

它有效,好吧,但我有一段丑陋的代码,如果上面的陈述看起来不那么优雅。

我正在考虑使用Reflection,这是开发一个独特的 set 方法,并将该属性的名称及其值传递给它。

另一个选项可能是将属性存储在Map中,但我不确定......

有什么想法吗?

提前致谢,

路易斯

2 个答案:

答案 0 :(得分:2)

我会使用Map并使用属性键声明静态变量:

public class Bean {
  public static final String ATTRIBUTE_1 = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn";
  public static final String ATTRIBUTE_2 = "...";
  ...
  public static final String ATTRIBUTE_N = "...";


  private Map<String, Object> map = new HashMap<String, Object>();

  public void put(String key, Object value) {
    map.put(key, value);
  }

  public Object get(String key) {
    map.get(key);
  }
}

然后,您使用静态变量来存储/检索值:

Bean bean = new Bean();

bean.set(Bean.ATTRIBUTE_1, someValue);

Object value = bean.get(Bean.ATTRIBUTE_1);

答案 1 :(得分:1)

救援的多态性

enum Attribute {
    UPN("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn") {
        void setValue(Principal principal, String value) {
            principal.setUpn(value);
        }
    },
    ...
    ;

    private final String name;

    private Attribute(String name) {
        this.name = name;
    }

    public abstract setValue(Principal principal, String name);

    public static Attribute getByName(String name) {
        for (Attribute attribute : values())
            if (attribute.name.equals(name))
                return attribute;

        return null;
    }

    public static void setByName(Principal principal, String name, String value) {
        Attribute attribute = getByName(name);

        if (attribute == null)
            throw new IllegalArgumentException("No such attribute");

        attribute.setValue(principal, value);
    }
}

如果您知道要设置的属性,则没有理由通过名称:

Attribute.UPN.setValue(principal, "something");