簡體   English   中英

接口實現的通用 equals 方法

[英]Common equals method for interface implementations

這可能是一種代碼味道,但我想知道這在 Java 中是否可行。鑒於我有我的界面:

public interface State {
    String getStateName();
}

我有一個這樣的實現:

public class DefaultState implements State {
    final String stateName;

    public DefaultState(String stateName) {
        this.stateName = stateName;
    }

    @Override
    public String getStateName() {return stateName; }

    @Override
    public boolean equals(Object other) {
        return ((State)other).getStateName().equals(this.stateName);
    }
}

另一個是這樣的:

public enum EnumState implements State {
    STATE_1("STATE1"),STATE_2("STATE_2");

    final String stateName;
    
    EnumState (String stateName) {
        this.stateName = stateName;
    }

    @Override
    public String getStateName() {return stateName; }
}

當我執行以下操作時,它失敗了,因為我無法覆蓋枚舉中equals的實現方式:

assertTrue(Arrays.asList(new DefaultState("STATE1")).contains(EnumState.STATE_1)); // fails

有沒有一種方法可以使這項工作起作用,或者最終的答案是您不應該混合這樣的實現嗎?

Arrays.asList(new DefaultState("STATE1")).contains(EnumState.STATE_1)這一行使用了contains方法,該方法的實現使用參數(此處為Enum)的equals方法進行比較,所以會返回false因為它會比較這是否是同一個 Enum 實例。

您不能覆蓋 Enums 上的 equals,因此一個可能的解決方案是 stream 並使用 DefaultState class 中覆蓋的 equals 找到符合您條件的任何元素:

assertTrue(Arrays.asList(new DefaultState("STATE1"))
                              .stream()
                                    .anyMatch(state -> state.equals(EnumState.STATE_1)));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM