2

我正在寻找像这样的基本枚举......

public enum SessionState {

    WAITING(true), VOTING(true), PREPARING(false), PLAYING(false), ENDING(false);

    boolean newPlayersJoin;

    private SessionState(boolean newPlayersJoin){
        this.newPlayersJoin = newPlayersJoin;
    }

    public boolean canNewPlayersJoin(){
        return newPlayersJoin;   
    }

}

...然后是另一个具有相同值(等待、投票、准备、播放、结束)但具有更多功能的枚举。我想要一个没有额外方法的基本枚举的原因是某些方法依赖于不会包含在该 jar 文件中的函数(多模块项目)

我的另一个枚举看起来像这样

public enum SessionStateCopy {

    WAITING(true, ... extra values), VOTING(true, ... extra values), PREPARING(false, ... extra values), PLAYING(false, ... extra values), ENDING(false, ... extra values);

    boolean newPlayersJoin;

    private SessionStateCopy(boolean newPlayersJoin, ... extra values){
        this.newPlayersJoin = newPlayersJoin;
    }

    public boolean canNewPlayersJoin(){
        return newPlayersJoin;   
    }

    ... extra methods

}
4

2 回答 2

2

enumJava 中的 s 是隐式的final,所以你不能互相继承它们。我有两个不同enum的 s,就像你在 OP 中一样,并添加几个方法在它们之间进行转换:

public static SessionState convert(SessionStateCopy s) {
    return SessionState.valueOf(s.name());
}

public static SessionStateCopy convert(SessionState s) {
    return SessionStateCopy .valueOf(s.name());
}

只是为了确保您不会意外地将值添加到一个而不是另一个,我将添加一个 JUnit 测试以确保这一点:

// imports snipped for clarity
public class SessionStateTest() {

    public void testMatchingMembers() {
        assertEquals("wrong number of values", SessionState.values().size(), SessionStateCopy.values().size());
        for (SessionState s: SessionState.values()) {
            assertEquals ("wrong value", s, convert(convert(s));
        }
    }
}
于 2013-11-08T18:17:24.130 回答
0

如果我正确理解您的问题,您想要enum扩展enum.

不能

但是,您可以让两个enums 实现相同的interface.

功能较差的一个将实现所有方法但什么也不做。

另一个将提供interface's 方法的“有用”实现。

例如:

enum Foo { // "extends Bar" would not compile
    FOO();
}
interface Blah {
    void meh();
}
enum Bar implements Blah {
    SOMETHING();
    public void meh() {
        // nope     
    }
}
enum GreatBar implements Blah {
    SOMETHING();
    public void meh() {
        System.out.println("I'm doing something here!");
    }
}
于 2013-11-08T18:15:52.060 回答