锁定老帖子 主题:神奇的java枚举
精华帖 (0) :: 良好帖 (3) :: 新手帖 (12) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2009-10-16
night_stalker 写道 大部分场景字符串就够了 —— 直白不折腾、读程序一看就懂。
性能关键的地方,不如用整数位运算。 所以枚举基本没用 …… scala 就没有枚举。 我觉得这是基于人性本恶假定的设计 —— 程序员很坏,一定会想办法写错,能做成选择题就不做成填空题。这种限定设计有时可以提高代码安全,但有时也会让人很不爽,结果就是反而降低了开发效率和代码质量。 这么说就错了, Enum 与 String 比有两大优势 1. 类型安全, 不会出现非法参数 2. Enum 本身就是个普通的 class, 可以有很多自定义方法用来实现不同的功能,用 String 就必须借助于一些 helper 方法, 这对于静态语言是很重要的特性, 看一下 java.util.concurrent.TimeUnit : NANOSECONDS { public long toNanos(long d) { return d; } public long toMicros(long d) { return d/(C1/C0); } public long toMillis(long d) { return d/(C2/C0); } public long toSeconds(long d) { return d/(C3/C0); } public long toMinutes(long d) { return d/(C4/C0); } public long toHours(long d) { return d/(C5/C0); } public long toDays(long d) { return d/(C6/C0); } public long convert(long d, TimeUnit u) { return u.toNanos(d); } int excessNanos(long d, long m) { return (int)(d - (m*C2)); } }, |
|
返回顶楼 | |
发表时间:2009-10-17
最后修改:2009-10-17
反编译一个自定义Enum类,可以看到它其实就是一个继承Enum的final class,里面值就是一个静态实例
package enumTest; public enum Fruit { APPLE; } 反编译结果: package enumTest; public final class Fruit extends Enum { private Fruit(String s, int i) { super(s, i); } public static Fruit[] values() { Fruit afruit[]; int i; Fruit afruit1[]; System.arraycopy(afruit = ENUM$VALUES, 0, afruit1 = new Fruit[i = afruit.length], 0, i); return afruit1; } public static Fruit valueOf(String s) { return (Fruit)Enum.valueOf(enumTest/Fruit, s); } public static final Fruit APPLE; private static final Fruit ENUM$VALUES[]; static { APPLE = new Fruit("APPLE", 0); ENUM$VALUES = (new Fruit[] { APPLE }); } } 可以用枚举来写单例类,比较方便 package enumTest; public enum Singleton { INSTANCE; public void doXX(){ // do something } public static void main(String[] args) { Singleton.INSTANCE.doXX(); } } |
|
返回顶楼 | |
发表时间:2009-10-18
我也觉得java的enum不如c和c#那种简单实用……
这个事情郁闷我很久了。 |
|
返回顶楼 | |
发表时间:2009-10-18
flashing 写道 我也觉得java的enum不如c和c#那种简单实用……
这个事情郁闷我很久了。 我觉得,可能java设计的enum有点class的感觉,所以有点差不多的感觉,大家就很少会去用他了 |
|
返回顶楼 | |
发表时间:2009-10-18
最后修改:2009-10-18
shishuwu 写道 反编译一个自定义Enum类,可以看到它其实就是一个继承Enum的final class,里面值就是一个静态实例
package enumTest; public enum Fruit { APPLE; } 反编译结果: package enumTest; public final class Fruit extends Enum { private Fruit(String s, int i) { super(s, i); } public static Fruit[] values() { Fruit afruit[]; int i; Fruit afruit1[]; System.arraycopy(afruit = ENUM$VALUES, 0, afruit1 = new Fruit[i = afruit.length], 0, i); return afruit1; } public static Fruit valueOf(String s) { return (Fruit)Enum.valueOf(enumTest/Fruit, s); } public static final Fruit APPLE; private static final Fruit ENUM$VALUES[]; static { APPLE = new Fruit("APPLE", 0); ENUM$VALUES = (new Fruit[] { APPLE }); } } 可以用枚举来写单例类,比较方便 package enumTest; public enum Singleton { INSTANCE; public void doXX(){ // do something } public static void main(String[] args) { Singleton.INSTANCE.doXX(); } } 这个反编译的结果相对实际情况来说就是杯具啊……Java用擦除法实现泛型所引发的杯具。 enum的声明展开后应该是public final class Fruit extends Enum<Fruit>才对。Enum自身是public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable。 |
|
返回顶楼 | |
发表时间:2009-10-18
最后修改:2009-10-18
我来举个例子,例如那个values()方法只能用在具体的枚举类,如果自己写通用工具类需要通过其他方法遍历:
public static <T> void test(Class<T> cls) { for (T enumType : (T[]) cls.getEnumConstants()) { System.out.println(enumType); } } |
|
返回顶楼 | |
发表时间:2009-10-23
呃。。我觉得 控制器 常用的参数 用枚举比较合适
各位能不能说下还有哪些场合适合用枚举? |
|
返回顶楼 | |
发表时间:2010-10-11
我还是比较喜欢用enum的,总感觉可以把一大堆相关的常量定义归为一类,多个开发者一起使用,有约束,不会乱套
|
|
返回顶楼 | |