enum 居然要这么写,我彻底惊呆了

avi9111 2013-11-25 06:59:24
在写了5年.net,三年android之后,在今天晚上,我才知道java的枚举要这么写,我对java彻底无语了
我的惊讶之情,真不是文字能表达的,我所有的骂人的话用在java上都不够用。

enum FruitEnum {
APPLE(1), ORANGE(2); // 调用构造函数来构造枚举项

private int value = 0;

private FruitEnum(int value) { // 必须是private的,否则编译错误
this.value = value;
}

public static FruitEnum valueOf(int value) { // 手写的从int到enum的转换函数
switch (value) {
case 1:
return APPLE;
case 2:
return ORANGE;
default:
return null;
}
}

public int value() {
return this.value;
}
}

什么values of names那些方法简直就是狗屁
我要用String找一个值?我真不如写静态方法好了
private static String Ready="0";
private static String OnHold="1";
...全文
1259 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
yktd26 2013-11-28
  • 打赏
  • 举报
回复
小伙伴们都惊呆了为什么你会惊呆了而那么多人都没有惊呆你还会放弃治疗
张自强 2013-11-28
  • 打赏
  • 举报
回复
java1.5吸收c的优点加入枚举,提倡使用。本人也一直在用分享下:

  public static FruitEnum valueOf(int value) {   
    	FruitEnum[] fs = FruitEnum.values();
    	for (FruitEnum f:fs) {
			if(f.value==value)return f;
		}
		return null;
  }

这么写好点; 还有如果只是个1,2 的就别用构造函数,直接

enum FruitEnum {
    APPLE, ORANGE;
}
当还有其他值得时候用构造函数如下:


package ass;

enum FruitEnum {
    APPLE(1,"红色"), ORANGE(2,"黄色");   

    private int value = 0;
    private String desc;
    private FruitEnum(int value,String desc) {   
        this.value = value;
        this.desc = desc;
    }

    public static FruitEnum valueOf(int value) {   
    	FruitEnum[] fs = FruitEnum.values();
    	for (FruitEnum f:fs) {
			if(f.value==value)return f;
		}
		return null;
    }

    public int value() {
        return this.value;
    }
    
    public static void main(String[] args) {
    	
	}
}
这时候用构造函数才优雅。 欢迎加入java技术交流群:60840475 进行讨论。
sunbo624 2013-11-28
  • 打赏
  • 举报
回复
你根本就不需要枚举成员具体的值 直接定义就行 根本用不着int那些东西
  • 打赏
  • 举报
回复
枚举的作用是为了类型安全,可以不让非法的数据作为参数传入。 当然,采取这样的方法是可行的: public static final String READY = "0"; public static final String ON_HOLD = "1"; 如果这样用的话,对于调用者来说,可以传个 "abc" 也是未偿不可的。如果采用枚举的话,就不能想使用什么就使用什么了。 另外,枚举有很多使用方法,可以在枚举中声明抽象方法,在不同的枚举值中实现该方法,以达到工厂方法的目的。 PS:使用枚举时,很少会使用其序号值,一般直接使用其枚举量。 当然了,Java 中的枚举只是一颗语法糖而已,在编译后的字节码与常量枚举类所产生的效果是一致的。 语法都很简单,就看怎么去灵活运用了,这才是技术人员的根本。
foryou2016 2013-11-27
  • 打赏
  • 举报
回复
mr_wangb 2013-11-27
  • 打赏
  • 举报
回复
引用 1 楼 freeman527 的回复:
很简单的枚举啊。

public class TestLogger {
	public static void main(String[] args) {
		System.out.println(DIR.LEFT);
		System.out.println(DIR.RIGHT);
	}
	static enum DIR{
		LEFT,RIGHT,UP,DOWM;
	}
}
lz的看不懂,感觉这就是正解
raistlic 2013-11-27
  • 打赏
  • 举报
回复
enum FruitEnum { APPLE, ORANGE; } ======== FruitEnum.APPLE.ordinal(); // 0 FruitEnum.ORANGE.ordinal(); // 1 FruitEnum.values()[0]; // APPLE FruitEnum.values()[1]; // ORANGE 这都是枚举的基本用法,枚举是类,可以实现接口,并且是常用的实例化控制手段,很多单例写成枚举。 吐槽之前至少先入门。
whos2002110 2013-11-26
  • 打赏
  • 举报
回复
steely_chen 2013-11-26
  • 打赏
  • 举报
回复
没有看完回复,只能说8年的开发经验还发这样的贴,不要随便跟别人说自己是写程序的。
aaaabbbccd9876 2013-11-26
  • 打赏
  • 举报
回复
不明绝粒
Inhibitory 2013-11-26
  • 打赏
  • 举报
回复
Java的Enum不是简单的Enum,应该可以理解为对象池。
张含韵 2013-11-26
  • 打赏
  • 举报
回复
顶一个
郑涛 2013-11-26
  • 打赏
  • 举报
回复
枚举不知这样用的,看一下TimeUnit的代码,所有方法看java.lang.Enum 可以实现接口,不能继承。 this.ordinal(); // 顺序号,从0开始 this.name(); // 枚举字符串形式 UserTypeEnum Customer = UserTypeEnum.values()[1]; // 通过class获取所有枚举数组,再根据下标活动具体哪个枚举对象 Customer =UserTypeEnum.valueOf("Customer"); Class clazz=UserTypeEnum.class; Customer =Enum.valueOf(clazz, "Customer");
genganpeng 2013-11-25
  • 打赏
  • 举报
回复
引用 9 楼 avi9111 的回复:
1=ios只是个比喻,也不是说项目中就这么写
public static FruitEnum valueOf(int value) { // 手写的从int到enum的转换函数 你这边的value作用是序号吗?就是和枚举关联的int型整数,还是有其他含义?
avi9111 2013-11-25
  • 打赏
  • 举报
回复
1=ios只是个比喻,也不是说项目中就这么写
avi9111 2013-11-25
  • 打赏
  • 举报
回复
引用 7 楼 genganpeng 的回复:
[quote=引用 5 楼 avi9111 的回复:] 我想我大概知道什么问题了,因为那是android,所以不能这样写if(1==MobileOSType.IOS){},j2se可以这样写么?
MobileOSType.IOS是一个类,怎么可能和1比较,应该是if(1==MobileOSType.IOS.ordinal()){},[/quote] 这就是java的问题 你没想过为什么这个不是一个int,而是一个类么,我写了5年.net,所以从来没觉得ios应该是个类啊, 我5年来大部分的需求就是if(ios=1),为什么ios也不能自动转为int?所以我1楼的写法就是最简洁,能调用的写法了,写复杂,以后自己或别人调用就方便了,如果不这样写,根本没法用,反正我看遍历也是很不爽的。 也没有写5,6个if,我看过不少java的代码是写5,6个if的,虽然也可以用其他写法,也没有很不爽, 因为当时项目赶或者什么原因真的需要!
genganpeng 2013-11-25
  • 打赏
  • 举报
回复
引用 5 楼 avi9111 的回复:
我想我大概知道什么问题了,因为那是android,所以不能这样写if(1==MobileOSType.IOS){},j2se可以这样写么?
MobileOSType.IOS是一个类,怎么可能和1比较,应该是if(1==MobileOSType.IOS.ordinal()){},
失落夏天 2013-11-25
  • 打赏
  • 举报
回复
如果我想使用 switch语句,String形式可以么? 而如果 private static int Ready=0; private static String OnHold=1; 这样的话,你觉得看着舒服么? 另外,你如果连续用5个6个if else语句,你不觉得难受么
avi9111 2013-11-25
  • 打赏
  • 举报
回复
我想我大概知道什么问题了,因为那是android,所以不能这样写if(1==MobileOSType.IOS){},j2se可以这样写么?
teemai 2013-11-25
  • 打赏
  • 举报
回复
你那代码写得有点2吧。枚举正常使用就行了。

public enum MobileOSType {
                IOS, ANDROID, WEB
        }
加载更多回复(3)

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧