2015-12-10 104 views
0

從技術上壞的設計有一個地圖,Foo1和foo2的可能在技術上是平等的,但你還是希望他們有關於他們,使得不同的特質:地圖與同一對象鍵值

Foo foo2 = new Foo("id1", 4); 
    Foo foo1 = map.get(foo2); 
    if(foo1 != null){ 
     map.replace(foo1, foo1.combine(foo2)); 
    } 

隱而不宣」這在技術上違反了「等於」?我注意到在Multiset中沒有get這個函數是有道理的,因爲如果這個集合包含了這個對象,那麼你已經擁有了它,所以不需要去檢索它。

但在同一時間,好像過殺有一個地圖,其中包含鍵和值相同的對象這就是爲什麼我一直在尋找到多集

編輯:結合返回相同的對象仍然「等於「但結合了屬性。

I.E.

public class Foo { 
String id; 
int length; 

public combine(Foo foo){ 
    this.length += foo.length; 
    return this; 
} 

@Override equals(Object o){ 
... 
return this.id == that.id; 
} 
+2

什麼是組合()' – OPK

+0

只是將兩者結合到同一個對象,即如果foo1和foo2有長度,那麼它會將長度加在一起。但它仍然返回包含相同「等於」屬性的對象。 –

+0

等於應該唯一標識一個對象。如果你想要上述行爲,那麼foo1和foo2應該爲hashCode()返回相同的值。你應該根據我的想法合併它們。然後調用containsKey(foo1)並在該基礎上進行合併操作。 – pandaadb

回答

1

等號和散列碼有一個合約,其他類依賴正確實施。我不會濫用這些方法來解決這個問題。

更好的辦法是有一個自定義界面

public interface MergeAble<T> { 

    public boolean canMerge(T other); 

} 

你的對象則可以實現這一點,你可以自定義邏輯合併在自己的界面來實現這些目標。