JavaBean集合属性。多个if语句可选
我想再次得到你对设计问题的意见 我有一个具有15个属性的JavaBean。对于输入属性,我有一个循环For,循环遍历键值对集合(具体地说是SAML属性,我将属性响应映射到主体属性)。我根据键值调用适当的setter方法,如下所示: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
.../...
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。这也是我的第一个方法。