Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaBean集合属性。多个if语句可选_Java_Refactoring_Javabeans - Fatal编程技术网

JavaBean集合属性。多个if语句可选

JavaBean集合属性。多个if语句可选,java,refactoring,javabeans,Java,Refactoring,Javabeans,我想再次得到你对设计问题的意见 我有一个具有15个属性的JavaBean。对于输入属性,我有一个循环For,循环遍历键值对集合(具体地说是SAML属性,我将属性响应映射到主体属性)。我根据键值调用适当的setter方法,如下所示: .../... for (SAML2AttributeInfo attr : attrs) { if (attr.getAttributeName().equals("http://schemas.xmlsoap.org/ws/2005

我想再次得到你对设计问题的意见

我有一个具有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
    }
它可以工作,好吧,但我有一段丑陋的代码,15如果像上面这样的语句看起来不太优雅

我正在考虑使用,这是,开发一个独特的集合方法,并将属性的名称和他的值传递给它

另一个选择是将属性存储在一个文件中,但我不确定

有什么想法吗

提前感谢,


Luis

我将使用映射并使用属性键声明静态变量:

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

我将使用映射并使用属性键声明静态变量:

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

用于救援的多态性

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

用于救援的多态性

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

我将更进一步,在枚举中添加一个静态属性getByName(String name)方法,以避免强制客户端迭代所有值。我实现了这样一个方法:
public静态属性getAttributeByName(字符串名称){Attribute Attribute=null;for(Attribute attr:Attribute.values()){if(attr.getName().equals(name))Attribute=attr;break;}return Attribute;}
我不确定是否是最好的实现……我会更进一步,在枚举中添加一个静态属性getByName(字符串名称)方法,以避免强制客户端迭代所有值。您好,非常感谢。我实现了这样一个方法:
public静态属性getAttributeByName(字符串名称){Attribute Attribute=null;for(Attribute attr:Attribute.values()){if(attr.getName().equals(name))Attribute=attr;break;}return Attribute;}
我不确定这是否是最好的实现……像这样的常量列表应该用枚举代替。非常感谢Pablo。这也是我的第一个方法。像这样的常量列表应该被一个枚举替换。非常感谢Pablo。这也是我的第一个方法。