当前位置: 首页 > 知识库问答 >
问题:

Java:新枚举,它是旧枚举的子集

谷梁凌
2023-03-14

在Java中,有没有办法从现有枚举中定义一个新枚举?我想要以下功能。

public enum A{1, 2, 3, 4, 5, 6, 7, 8, 9};
public enum B{1, 2, 3, 4};
public enum C{3, 4, 5, 6, 7};

1、2、3和所有这些都必须相同,即,

A.1 == B.1 = true
B.4 == C.4 = true

一个真实的例子是天、星期、周末、讲座、派对等。

共有3个答案

百里阳平
2023-03-14

我认为你最好的选择是做这样的事情:

public class EnumTest
{
  public enum A {
    X1(1), X2(2), X3(3), X4(4), X5(5), X6(6), X7(7), X8(8), X9(9);

    private final int value;
    public int getValue() { return this.value; }
    A(int value) {
      this.value = value;
    }
  }
  public enum B {
    X1(1), X2(2), X3(3), X4(4);
    private final int value;
    public int getValue() { return this.value; }
    B(int value) {
      this.value = value;
    }
  }
  public enum C {
    X3(3), X4(4), X5(5), X6(6), X7(7);

    private final int value;
    public int getValue() { return this.value; }
    C(int value) {
      this.value = value;
    }
  }

  public static void main()
  {
    A a;
    a = A.X1;
    B b;
    b = B.X1;
    if (b.getValue()==a.getValue()) {
      // do something
    }
  }
}

但是,如果您这样做,您应该注意,您实际上使用的是枚举的类型安全性,否则为什么不将所有值存储为整数呢?类似这样的情况下,如果您有时想要在枚举之间进行比较,但通常想要使用类型安全性,那么每个枚举值都有一些其他含义可能很有用。在您的“DAYS、WEEKDAYS、WEEKENDDAYS、TeachedDays”示例中,我会确保内部值是强类型的,比如Java8java。时间DayOfWeek

颜修为
2023-03-14

Java中的枚举类型提供了定义其他属性和方法的能力。

public enum DAY_INDICATOR {
  SUNDAY(1,true), MONDAY(2,false), TUESDAY(3,false), WEDNESDAY(4,false), THURSDAY(5,false), FRIDAY(6,false), SATURDAY(7,true)
  private final int dayNumber;
  private final bool weekendDay;
  public DAY_INDICATOR(int dn, bool wd) {
    dayNumber = dn;
    weekendDay = wd;
  }
  public bool isWeekendDay() {
    return weekendDay;
  }
  ... more accoutrements of an enumerated type
}

现在,您可以使用根据业务规则区分枚举值集成员所需的任何谓词来扩展基础类型。

司马作人
2023-03-14

您不能扩展枚举,但从您的周/周末示例来看,您似乎需要稍微改变一下想法。如果我们有枚举日{MON、TUE、WED、THU、FRI、SAT、SUN},然后按如下方式考虑周/周末:

EnumSet<Days> weekDays    = EnumSet.range(Days.MON, Days.FRI);
EnumSet<Days> weekendDays = EnumSet.range(Days.SAT, Days.SUN);
EnumSet<Days> partyDays   = EnumSet.of( Days.TUE, Days.THU );

自然的问题,比如“任何一周都是聚会日吗?”然后可以如您所期望的那样表达:

!Collections.disjoint(weekDays, partyDays)

希望这有帮助。

 类似资料:
  • 问题内容: 这不是卡住我的问题,而是我正在寻找一种编写代码的整洁方法。 本质上,我正在编写一个事件驱动的应用程序。用户触发一个事件,该事件被发送到适当的对象,然后这些对象处理事件。现在,我正在编写偶数处理程序方法,并且希望使用switch语句确定如何处理事件。现在,在我研究通用结构时,事件类非常简单: 然后,在另一堂课中,我会看到类似以下内容的内容: 我会 喜欢 做的就是这样的事情(尽管我当然会坚

  • 问题内容: 在JDK1.5之前的Java中,“ Typesafe Enum”模式是实现只能接受有限数量的值的类型的常用方法: (例如,参见Bloch的Effective Java中的第21项)。 现在在JDK1.5 +中,显然可以使用“官方”方式enum: 显然,该语法更好,更简洁(不需要为值明确定义字段,适当toString()提供),但是到目前为止enum看起来非常类似于模式。 我知道的其他差

  • 主要内容:声明枚举,枚举类,为枚举添加方法,EnumMap 与 EnumSet枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在曰常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。 在 JDK 1.5 之前没有枚举类型,那时候一般用接口常量来替代。而使用 Java 枚举类型 enum 可以更贴近地表示这种常量。 声明枚举 声明枚举时必须使用 enu

  • 问题内容: 我有一个枚举的类对象(我有一个),我需要获取此枚举表示的枚举值的列表。该静态函数有我需要什么,但我不知道怎么去从类对象访问它。 问题答案:

  • 问题内容: 通过阅读SCJP书籍,我在第1章“自测”中发现了类似的内容: 注意:代码编译正常。我不明白的是为什么我们可以从变量访问DOG,CAT或FISH常量。我认为(并且也写在书中)DOG,FISH,CAT是常量,其实现方式类似于。 所以,如果它们确实是静态的,为什么我们可以从中访问它们呢?最后一行是我熟悉的方式。 问题答案: 写作 和写作一样。也就是说,编译器将用其编译时类型Animal替换变

  • 使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。 TypeScript支持数字的和基于字符串的枚举。 数字枚举 首先我们看看数字枚举,如果你使用过其它编程语言应该会很熟悉。 enum Direction { Up = 1, Down, Left, Right } 如上,我们定义了一个数字枚举,Up使用初始化为1。 其余的成员