2016-01-06 18 views
0

我有一個從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循環,但我不得不說,我找不到一個聰明的解決方案。

什麼是你的選擇?

感謝, 丹妮。

Pd積是的,我想是這樣

private Object getAttribute(EmployeeIF employee, String attribute) 
+0

您在'Map'工作,爲什麼難道你不使用it's關鍵的,直接從鑰匙獲得的價值? – SomeJavaGuy

+0

我無法更改屬性MapIF,它是地圖的關鍵。這也是自動生成的。 –

+0

您必須在Employee類中重寫equals()方法。然後你可以使用map.get()調用。 – Sunny

回答

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")); 
    } 
} 

的鑰匙,是重寫equalshashCodeAttributeIF類。所以,如果你是通過一個虛擬的對象,他們AttributeIF你想有你的地圖需要識別這個虛擬對象是具有theoretcly「平等」重點對象實例的您Map內的情況下等於。