论坛首页 Java企业应用论坛

神奇的java枚举

浏览 18712 次
精华帖 (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)); }
    },

5 请登录后投票
   发表时间: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();
	}
}
0 请登录后投票
   发表时间:2009-10-18  
我也觉得java的enum不如c和c#那种简单实用……
这个事情郁闷我很久了。
0 请登录后投票
   发表时间:2009-10-18  
flashing 写道
我也觉得java的enum不如c和c#那种简单实用……
这个事情郁闷我很久了。

我觉得,可能java设计的enum有点class的感觉,所以有点差不多的感觉,大家就很少会去用他了
0 请登录后投票
   发表时间: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。
0 请登录后投票
   发表时间: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);   
        }   
    }  
0 请登录后投票
   发表时间:2009-10-23  
呃。。我觉得 控制器 常用的参数 用枚举比较合适
各位能不能说下还有哪些场合适合用枚举?
0 请登录后投票
   发表时间:2010-10-11  
我还是比较喜欢用enum的,总感觉可以把一大堆相关的常量定义归为一类,多个开发者一起使用,有约束,不会乱套
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics