我想再次就设计问题发表意见。
我有一个包含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中,但我不确定......
有什么想法吗?
提前致谢,
路易斯
答案 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");