Java 与<;关键、价值>;以干净的方式枚举
我正在寻找实现和访问我的枚举的方法,但我对代码的外观不是很满意。这似乎是一种修补方法。下面是我想做的: 将此简单枚举作为我尝试执行的一个示例:Java 与<;关键、价值>;以干净的方式枚举,java,enums,Java,Enums,我正在寻找实现和访问我的枚举的方法,但我对代码的外观不是很满意。这似乎是一种修补方法。下面是我想做的: 将此简单枚举作为我尝试执行的一个示例: public enum MyEnum { FIRST(0L), SECOND(1L), THIRD(2L); private Long number; private MyEnum(Long number){ this.number= id; } public static boolean isFirst(MyEnum
public enum MyEnum {
FIRST(0L), SECOND(1L), THIRD(2L);
private Long number;
private MyEnum(Long number){
this.number= id;
}
public static boolean isFirst(MyEnum type) {
return type == FIRST;
}
public static boolean isSecond(MyEnum type) {
return type == SECOND;
}
public static boolean isThird(MyEnum type) {
return type == THIRD;
}
public Long getId() {
return number;
}
}
稍后,我将一些对象设置为Long.valueOf(1L),并使用
Long.valueOf(1L).equals(instanceofmynum.getId())
我真的很讨厌在我的代码中都有那些硬编码的常量,所以我想知道使用这样的东西是否是一种不好的做法:
eMyEnum.FIRST.getId().equals(instanceOfMyEnum.getId())
或
这些只是一些简单的例子,但基本上是同一个问题反复出现。你觉得怎么样 为什么不在枚举中实现fromLong方法
public static MyEnum fromLong(long l) {
switch (l) {
{
case 0: return FIRST;
case 1: return SECOND;
case 2: return THIRD;
}
throw new IllegalArgumentException();
}
然后将long转换为枚举并比较枚举。所以你会:
MyEnum.fromLong(longValue) == MyEnum.FIRST
为什么不在枚举中实现fromLong方法呢
public static MyEnum fromLong(long l) {
switch (l) {
{
case 0: return FIRST;
case 1: return SECOND;
case 2: return THIRD;
}
throw new IllegalArgumentException();
}
然后将long转换为枚举并比较枚举。所以你会:
MyEnum.fromLong(longValue) == MyEnum.FIRST
如果您有很多枚举值,我会这样做(如果添加新值,则无需修改代码):
公共枚举MyEnum{
第一(0升)、第二(1升)、第三(2升);
私人长号码;
/**
*查找映射,提供按id访问枚举的快速方法
*/
私有静态最终映射查找=新建HashMap();
/**
*静态初始值设定项,它在运行时加载枚举值并映射它们
*给他们的“数字”成员。
*/
静止的{
MyEnum[]enums=MyEnum.class.getEnumConstants();
for(MyEnum en:enums){
查找.put(en.number,en);
}
}
私有MyEnum(最终长编号){
这个数字=数字;
}
/**
*获取与参数id关联的枚举值。
*@param id标识枚举值的id
*@返回枚举值,如果找不到,则返回null。
*/
公共静态MyEnum getById(最终长id){
返回LOOKUP.get(id);
}
}
如果您有很多枚举值,我会这样做(如果添加新的枚举值,则无需修改代码):
公共枚举MyEnum{
第一(0升)、第二(1升)、第三(2升);
私人长号码;
/**
*查找映射,提供按id访问枚举的快速方法
*/
私有静态最终映射查找=新建HashMap();
/**
*静态初始值设定项,它在运行时加载枚举值并映射它们
*给他们的“数字”成员。
*/
静止的{
MyEnum[]enums=MyEnum.class.getEnumConstants();
for(MyEnum en:enums){
查找.put(en.number,en);
}
}
私有MyEnum(最终长编号){
这个数字=数字;
}
/**
*获取与参数id关联的枚举值。
*@param id标识枚举值的id
*@返回枚举值,如果找不到,则返回null。
*/
公共静态MyEnum getById(最终长id){
返回LOOKUP.get(id);
}
}
显然,尽管您创建了一个enum,但您的应用程序仍然在所有地方使用这些长值,因此您可以使用如下内容:
public class TypeOfSomething {
public static final long FIRST = 1l;
public static final long ANALOG = 2l;
public static final long USB = 3l;
}
然后像这样使用它们:
someLongThatIPassAsParameter = TypeOfSomething.ANALOG;
枚举方式也很好,但我使用它的情况是,在参数中使用枚举值更方便,而枚举中的值只是附加信息(例如,用于国际化的messages.properties键)显然,尽管您创建了一个枚举,但您仍然到处使用这些长值,因此,也许你可以使用以下方法:
public class TypeOfSomething {
public static final long FIRST = 1l;
public static final long ANALOG = 2l;
public static final long USB = 3l;
}
然后像这样使用它们:
someLongThatIPassAsParameter = TypeOfSomething.ANALOG;
enum方法也很好,但我使用它的情况是,在参数中使用enum值更方便,而enum中的值只是附加信息(例如,messages.properties用于国际化的键)我不确定我是否正确理解了您的问题,但是使用switch进行检查这用于检查怎么样
public enum MyEnum {
FIRST(0L), SECOND(1L), THIRD(2L);
private Long number;
private static Map<Long, MyEnum> byIds = new HashMap<Long, PlaceServiceV2.MyEnum>();
static{
for(MyEnum myEnum :MyEnum.values()){
byIds.put(myEnum.number, myEnum);
}
}
private MyEnum(Long number){
this.number = number;
}
public static MyEnum getById(Long id) {
return byIds.get(id);
}
public Long getId() {
return number;
}
}
public void test(){
switch (MyEnum.getById(1L)) {
case FIRST:
break;
case SECOND:
break;
default:
break;
}
}
公共枚举MyEnum{
第一(0升)、第二(1升)、第三(2升);
私人长号码;
私有静态映射byIds=newhashmap();
静止的{
for(MyEnum MyEnum:MyEnum.values()){
byIds.put(myEnum.number,myEnum);
}
}
私有MyEnum(长编号){
这个数字=数字;
}
公共静态MyEnum getById(长id){
返回byIds.get(id);
}
公共长getId(){
返回号码;
}
}
公开无效测试(){
开关(MyEnum.getById(1L)){
案例一:
打破
案例二:
打破
违约:
打破
}
}
我不确定我是否正确理解了您的问题,但是使用开关进行检查怎么样
public enum MyEnum {
FIRST(0L), SECOND(1L), THIRD(2L);
private Long number;
private static Map<Long, MyEnum> byIds = new HashMap<Long, PlaceServiceV2.MyEnum>();
static{
for(MyEnum myEnum :MyEnum.values()){
byIds.put(myEnum.number, myEnum);
}
}
private MyEnum(Long number){
this.number = number;
}
public static MyEnum getById(Long id) {
return byIds.get(id);
}
public Long getId() {
return number;
}
}
public void test(){
switch (MyEnum.getById(1L)) {
case FIRST:
break;
case SECOND:
break;
default:
break;
}
}
公共枚举MyEnum{
第一(0升)、第二(1升)、第三(2升);
私人长号码;
私有静态映射byIds=newhashmap();
静止的{
for(MyEnum MyEnum:MyEnum.values()){
byIds.put(myEnum.number,myEnum);
}
}
私有MyEnum(长编号){
这个数字=数字;
}
公共静态MyEnum getById(长id){
返回byIds.get(id);
}
公共长getId(){
返回号码;
}
}
公开无效测试(){
开关(MyEnum.getById(1L)){
案例一:
打破
案例二:
打破
违约:
打破
}
}
我不明白为什么isAnalog()
和isUsb()
方法。。。为什么他们要检查第二个和第三个?或者这只是武断的。。。我希望你的程序不是这样。为什么不创建接受枚举类型并返回你想要的任何内容的方法呢?谢谢Yanick!信息技术