实现枚举值 [重复]

Posted

技术标签:

【中文标题】实现枚举值 [重复]【英文标题】:Implementing Enum Values [duplicate] 【发布时间】:2013-11-08 18:09:01 【问题描述】:

我希望有一个像这样的基本枚举...

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


【问题讨论】:

那么你的问题是什么? 你还没有问过问题。另外,请阅读***.com/questions/55375/add-values-to-enum 根据您的要求,我认为 Enum 是错误的数据类型,您需要的是抽象类或接口 如果你的问题是,枚举器是否可以通过扩展另一个枚举来继承:不可以。枚举只能实现接口。 您是否希望将状态信息存储在枚举值中?如果是这样,那似乎有点……奇怪。 【参考方案1】:

Java 中的enums 隐含为final,因此您不能相互继承它们。我会有两个不同的enums,就像你在 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));
        
    

【讨论】:

非常感谢!这真的很有帮助。 SessionStateCopy 可以在构造函数中使用 SessionState,反之亦然。在这种情况下,常数将彼此可比(尽管不在开关中)。如果需要,您可以执行if (someStateCopy.copy == SessionState.WAITING) 之类的操作。【参考方案2】:

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

你cannot。

但是,您可以让两个enums 实现相同的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!");
    

【讨论】:

以上是关于实现枚举值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

c#枚举是不是可以出现重复值

Java枚举继承[重复]

获取枚举值[重复]

如何在枚举中获取枚举值的 int [重复]

获取枚举值[重复]

枚举不返回值[重复]