java - 如何避免不同的方法循环同一个列表?

标签 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 "";
}

...等等。你肯定明白了。

我需要包含一个新方法来从员工返回一个新属性,但由于我觉得这很难维护,所以我拒绝在那里添加一个新方法。 我正在考虑使用操作模式来以某种方式避免至少一次又一次地重复 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"));
    }
}

关键是覆盖 equalshashCode在你的AttributeIF类(class)。因此,如果您传递它们的虚拟对象 AttributeIF你确实想让你的 map 需要识别这个虚拟对象与你的 Map 中理论上“相等”的关键对象实例的实例相等.

关于java - 如何避免不同的方法循环同一个列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34630715/

相关文章:

java - 可插拔通信模块的设计模式

php - 内部工厂与外部工厂

java - 无法找到或加载主类 Foo

java - 关于代理平等的查询

java - 对数组 clone() 的方法引用导致 NoClassDefFoundError : Array

java - 如何使用 Retrofit 2.0 绕过 android SSL 证书检查

java - 继承是否与依赖倒置原则相矛盾

design-patterns - 您是否曾经从大自然中获得过编程解决方案?

java - 禁用的文本框在 jsp 中的页面刷新时丢失其值

java - 如何为 csv 文件创建主索引