我有一个从 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 "";
}
...等等。你肯定明白了。
我需要包含一个新方法来从员工返回一个新属性,但由于我觉得这很难维护,所以我拒绝在那里添加一个新方法。 我正在考虑使用操作模式来以某种方式避免至少一次又一次地重复 for 循环,但我不得不说我找不到一个明智的解决方案。
你的选择是什么?
谢谢, 丹尼。
P.D 是的,我尝试过类似的方法
private Object getAttribute(EmployeeIF employee, String attribute)
最佳答案
这是一个小示例,您如何根据您没有的对象作为键来获取值。
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
类(class)。因此,如果您传递它们的虚拟对象 AttributeIF
你确实想让你的 map 需要识别这个虚拟对象与你的 Map
中理论上“相等”的关键对象实例的实例相等.
关于java - 如何避免不同的方法循环同一个列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34630715/