我有一个从xml映射的类。为了简单起见,让我们想象这个类是这样的:
class Employee implements EmployeeIF {
Map<AttributeIF,Object> attribute = new HashMap<>();
@Override
public Map<AttributeIF,Object> getAttributes() { return attribute; }
}
这是我无法改变的。
现在,现有代码充满了以下方法:
public int getSalary(EmployeeIF employee) {
for(Entry<AttributeIF,Object> entry : employee.getAttributes()) {
if(entry.getKey().getName().equals("salary")) return (Integer)entry.getValue();
}
return 0;
}
public int getAddress(EmployeeIF employee) {
for(Entry<AttributeIF,Object> entry : employee.getAttributes()) {
if(entry.getKey().getName().equals("address")) return (String)entry.getValue();
}
return "";
}
......等等。你肯定有这个主意。
我需要包含一个新方法来从员工那里返回一个新属性,但是由于我觉得这很糟糕,我拒绝在那里添加一个新方法。 我正在考虑使用动作模式以某种方式避免至少重复againg和for循环,但我不得不说我找不到一个聪明的解决方案。
你的选择是什么?
谢谢, 达尼。
P.D是的我试过像
这样的东西private Object getAttribute(EmployeeIF employee, String attribute)
答案 0 :(得分:1)
这是一个很小的例子,你可以根据一个对象作为你没有的关键来获得价值。
public class TestObject {
public String val;
public TestObject(String val) {
this.val = val;
}
public static TestObject createDummy(String val) {
return new TestObject(val);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof TestObject)) return false;
return ((TestObject)obj).val.equals(this.val);
}
@Override
public int hashCode() {
System.out.println("THIS ONE IS IMPORTANT");
return val.hashCode();
}
}
public class TestMap {
public Map<TestObject, String> map = new HashMap<>();
public String get(String keyVal) {
return map.get(TestObject.createDummy(keyVal));
}
public static void main(String[] args) {
TestMap map = new TestMap();
TestObject o1 = new TestObject("A");
map.map.put(o1,"B");
TestObject o2 = new TestObject("B");
map.map.put(o2,"C");
TestObject o3 = new TestObject("C");
map.map.put(o3,"D");
System.out.println(map.get("B"));
}
}
它的关键是覆盖equals
课程中的hashCode
和AttributeIF
。因此,如果您传递的是AttributeIF
的虚拟对象,您确实希望您的地图需要将此虚拟对象标识为与{{1}中的理论上“相等”的关键对象实例的实例相等。 }。