A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王松朝 金牌黑马   /  2011-7-30 10:57  /  4481 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有没有办法将数组的元素创建成枚举类型?
如给一个String数组,就创建一个包含数组所有元素的枚举类.

3 个回复

倒序浏览
黑马网友  发表于 2011-7-30 11:10:16
沙发
数组里面存储枚举类型没有多大的意义吧,因为数组里面的类型不固定,而且数组大小声明之后不能变
但是Java提供了一个枚举的集合EnumSet专门为枚举设计的集合,[color=Red]里面存储的必须是指定的枚举类型的值,这个类型在创建枚举机会的时候显示或者隐士的指定[/color]
[color=Red]并且EnumSet是有序的,EnumSet以枚举值在Enum类里面定义的顺序来决定集合元素的顺序[/color]
比如下面的程序:[code=java]package cn.itcast.heima;
import java.util.*;

enum Season
{
        SPRING,SUMMER,FALL,WINTER
}
public class EnumSetDemo
{
        public static void main(String[] args)
        {
                //创建一个EnumSet集合,集合元素就是Season枚举类的全部枚举值
                EnumSet es1 = EnumSet.allOf(Season.class);
                //输出[SPRING,SUMMER,FALL,WINTER]
                System.out.println(es1);
                //创建一个EnumSet空集合,指定其集合元素是Season类的枚举值。
                EnumSet es2 = EnumSet.noneOf(Season.class);
                //输出[]
                System.out.println(es2);
                //手动添加两个元素
                es2.add(Season.WINTER);
                es2.add(Season.SPRING);
                //输出[SPRING,WINTER]
                System.out.println(es2);
                //以指定枚举值创建EnumSet集合
                EnumSet es3 = EnumSet.of(Season.SUMMER  , Season.WINTER);
                //输出[SUMMER,WINTER]
                System.out.println(es3);
                EnumSet es4 = EnumSet.range(Season.SUMMER  , Season.WINTER);
                //输出[SUMMER,FALL,WINTER]
                System.out.println(es4);
                //新创建的EnumSet集合的元素和es4集合的元素有相同类型,
                //es5的集合元素 + es4集合元素 = Season枚举类的全部枚举值
                EnumSet es5 = EnumSet.complementOf(es4);
                //输出[SPRING]
                System.out.println(es5);
        }
}[/code]下面程序用来测试上面定义的枚举类[code=java]package cn.itcast.heima
import java.util.*;
public class TestEnumSet
{
        public static void main(String[] args)
        {
                Collection c = new HashSet();
                c.clear();
                c.add(Season.FALL);
                c.add(Season.SPRING);
                //复制Collection集合中所有元素来创建EnumSet集合
                EnumSet enumSet = EnumSet.copyOf(c);
                //输出[SPRING,FALL]
                System.out.println(enumSet);
                c.add("中关村黑马程序员训练营");
                c.add("第三期于8月12日开班");
                //下面代码出现异常:因为c集合里的元素不是全部都为枚举值
                enumSet = EnumSet.copyOf(c);
        }
} [/code]当我们再复制枚举集合的时候要保证目标机会中的元素必须是同一个枚举类型的枚举值,否则将会抛出ClassCastException异常
回复 使用道具 举报
误会了小弟意思了,我的意思是把数组里面的String元素变成枚举类型;
本来是想通过改变数组的元素数量动态的创建枚举类型:从文件加载配置信息,装到数组中,然后跟据数组元素创建枚举,这样就可以用文件配置程序了,而且枚举是不可变的,这样是不是就比较安全了呢?
回复 使用道具 举报
黑马网友  发表于 2011-7-30 12:41:07
板凳
我个人觉的不行,因为我们在使用枚举类型的元素时,时不需要通过new 对象的,也就是在说在加载类时就已经存在,跟有没有创建对象时无关的,这跟我们静态代码块很相似。这样enum类要求加载类就要有数据而数组是创建对象之后才产生数据,编译时Enum就会因为得不到数据而出错。个人时这么理解的 学习了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马