JavaBean устанавливает атрибуты.Несколько альтернативных операторов if - PullRequest
0 голосов
/ 02 декабря 2011

Снова я хотел бы узнать ваше мнение о проблеме дизайна.

У меня есть JavaBean с 15 атрибутами. Для подачи атрибутов у меня есть for loop , который перебирает коллекцию пар ключ-значение (конкретно атрибуты 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
    }

Это работает, хорошо, но у меня есть некрасивый кусок кода, 15 операторов if, как выше, выглядят не очень элегантно.

Я думаю об использовании Отражение , то есть разработать уникальный метод set и передать ему имя атрибута и его значение.

Другим вариантом может быть сохранение атрибутов на карте , но я не уверен ...

Есть идеи?

Заранее спасибо,

Луис

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Я бы использовал 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 голос
/ 02 декабря 2011

Полиморфизм для спасения

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");
...