实现枚举值

时间:2013-11-08 18:09:01

标签: java enums implementation

我希望有这样的基础枚举...

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

}

2 个答案:

答案 0 :(得分:2)

Java中的

enum隐式final,因此您无法相互继承它们。我有两个不同的enum,就像你在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));
        }
    }
}

答案 1 :(得分:0)

如果我正确理解您的问题,您希望enum扩展enum

cannot

但是,您可以有两个enum实现相同的interface

功能较差的那个会实现所有方法,但什么都不做。

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

例如:

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