如何避免使用不同的方法循环相同的列表?

时间:2016-01-06 10:23:03

标签: java design-patterns

我有一个从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)

1 个答案:

答案 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课程中的hashCodeAttributeIF。因此,如果您传递的是AttributeIF的虚拟对象,您确实希望您的地图需要将此虚拟对象标识为与{{1}中的理论上“相等”的关键对象实例的实例相等。 }。