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);