Java 如何获取枚举值的附加属性?

Java 如何获取枚举值的附加属性?,java,enums,Java,Enums,在我的聊天应用程序中,我有一个枚举: enum ContactRelationType { Friend, Familiar, Ignored, Unknown, Guild, Officers, Academy, Community, System } ContactRelationType值的一半是房间(公会、官员、学院、社区、系统)。 我需要知道是不是有价值的房间 我知道三种方法: 第一: enum ContactRelationType {

在我的聊天应用程序中,我有一个枚举:

enum ContactRelationType {
  Friend,
  Familiar,
  Ignored,
  Unknown,  
  Guild,
  Officers,
  Academy,
  Community,
  System
}
ContactRelationType值的一半是房间(公会、官员、学院、社区、系统)。 我需要知道是不是有价值的房间

我知道三种方法:

第一:

enum ContactRelationType {
  Friend,
  Familiar,
  Ignored,
  Unknown,  
  Guild,
  Officers,
  Academy,
  Community,
  System;

    public boolean isRoom() {
    return this == Guild ||
        this == Officers ||
        this == Academy ||
        this == Community ||
        this == System;
  }
}
它看起来很难看,这个想法告诉我“过于复杂的布尔表达式”,事实确实如此

第二点:

    enum ContactRelationType {
      Friend,
      Familiar,
      Ignored,
      Unknown,  
      Guild,
      Officers,
      Academy,
      Community,
      System;

    public boolean isRoom() {
      switch (this) {
        case Guild:
        case Officers:
        case Academy:
        case Community:
        case System:
          return true;
        default:
          return false;
    }
}
它看起来也很难看

第三:

    public enum ContactRelationType {
      Friend(false),
      Familiar(false),
      Ignored(false),
      Unknown(false),
      Guild(true),
      Officers(true),
      Academy(true),
      Community(true),
      System(true);

      private boolean room;

      ContactRelationType(boolean room) {
        this.room = room;
      }

      public boolean isRoom() {
        return room;
      }
}
但在本例中,我在所有枚举实例中都有
布尔房间


那么,什么解决方案更好?为什么?

您可能可以使用
枚举集。它们通过
位集
等价物非常有效地实现

enum ContactRelationType {

    Friend,
    Familiar,
    Ignored,
    Unknown,
    Guild,
    Officers,
    Academy,
    Community,
    System;

    public boolean isRoomRelation() {
        return RoomContacts.contains(this);
    }
}

static final Set<ContactRelationType> RoomContacts = EnumSet.of(
        ContactRelationType.Guild,
        ContactRelationType.Officers,
        ContactRelationType.Academy,
        ContactRelationType.Community,
        ContactRelationType.System);
enum ContactRelationType{
朋友,
熟悉的
忽略,
不详,
公会
官员们,
学院
社区,
制度;
公共布尔值isRoomRelation(){
返回RoomContacts.contains(此);
}
}
静态最终设置RoomContacts=EnumSet.of(
ContactRelationType.Guild,
联系关系类型。官员,
ContactRelationType.Academy,
ContactRelationType.Community,
ContactRelationType.System);

您使用布尔标志的解决方案是好的。只需添加一个默认构造函数:

 ContactRelationType() {
    this(false);
  }
现在,您不必为每个枚举成员编写
true
false
;仅适用于非“默认”的:


private static final Set ROOMS=EnumSet.range(公会、系统)
。然后在方法
ROOMS.contains(this)
中。更相关的问题是为什么您的
enum
代表两种不同的类型?谢谢,这看起来是一个很好的解决方案。我不想在UI中区分这种类型。第三种是最优雅的,适合Java的最佳实践等(Joshua Blosh的书等)。数据字节数很少(可能代码字节数更少?),数据的内部表示会以任何方式影响UI吗?这里有点不对劲…如果用户界面不区分,就在那里建立一个联盟。可能让这两种枚举类型实现一个公共接口。@BoristheSpider-这可能更有效,但假定有未声明的内容。
public enum ContactRelationType {
  Friend,
  Familiar,
  Ignored,
  Unknown,
  Guild(true),
  Officers(true),
  Academy(true),
  Community(true),
  System(true);