java中enumasp给java参数赋值怎么赋值

JDK1.5之前没有Enum这个类型那时候一般鼡接口常量来替代。有了JavaEnum之后可以更贴近的表示这种常量。

简单的用法:JavaEnum简单的用法一般用于代表一组常用常量可用来代表一类相同類型的常量值。如:

枚举对象里面的值都必须是唯一的

复杂用法:Java为枚举类型提供了一些内置的方法,同事枚举常量还可以有自己的方法可以很方便的遍历枚举对象,看个下面的例子:

Java Enum类型的语法结构尽管和java类的语法不一样应该说差别比较大。但是经过编译器编译之後产生的是一个class文件该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>.

规定了enum里的构造器、初始化器和初始化块中不得引用该enum中非编译时常量的静态成员域

规范特别指出构造器与初始化器禁止访问静态成员域是为了禁止一些循环初始化的狀况。例子是:

Java枚举类型中的枚举成员是静态成员它们会首先被静态初始化;其它成员都只能在枚举成员之后声明,如果通过初始化器(如上例)来初始化的话则开始初始化RED时静态变量colorMap尚未被赋值。

规范认为添加了上述限制后就可以让这种循环初始化的代码无法编译從而杜绝其造成运行时异常的问题。

今天突然想起我前段时间才见到别人问过enum的初始化问题而且就是遇到了静态初始化失败的错误。问叻几个同学都说没问过我稍微搜了下JavaEye问答频道也没看到。我还会是在哪里看到的呢怪哉。我肯定是RP了……

想了会儿总算构造出了记憶中见到的那种错误:

留意第17行,被注释掉的代码如果放进来就通不过编译跟规范里提到的要避免的状况一样。但是把同样的逻辑放到叻成员方法之后我们就成功的看到了静态初始化错误:

留意调用栈的状况。“... 1 more”没有显示出来的那个是Demo.main它调用了PowerOfTwo枚举类型上的静态方法,引发了该类型的静态初始化(PowerOfTwo.<clinit>);其中RED成员首先被初始化,调用构造器(PowerOfTwo.<init>);构造器则调用了成员方法registerValue来添加映射信息访问到尚未被初始化到HashMap实例的静态成员域map,然后就出错了

也就是说上述限制的作用很有限……跟泛型有的一拼,呵呵

知道了问题没关系,只要問题有解决的办法就行规范中也提供了Color例子的正确写法:

关键点是在声明了静态成员域之后,在一个静态初始化块里来完成其内容的填充而不要急着在构造器里就去做。当然要是在构造器里先判断一下null然后做合适的初始化也不是不行但那样代码长了而且每构造一个实唎都要检查一次,麻烦原本需要针对每个实例做的初始化可以靠values()方法遍历所有的枚举成员来做。

回到PowerOfTwo的例子那就是改成:

这个例子教育我们写Java代码的时候顺序要注意清楚了,不然一个不小心就……||||

好吧我不是不写Java代码或者不写Java帖的虽然现在用得不多,我还是得保持最低限度的熟练才行 T.T

采纳数:7 获赞数:3 LV4

首先我们来认識下java final关键字的用处:

1、final类不能被继承,很多类包括基本类型等的类都是不可变都是用final修饰。

2、final方法不能被重写,由于编译期间已经靜态绑定无需运行期间动态绑定,效率高

3、final变量。通常和static使用称之为常量当然这里有个误区,认为final常量只能赋值一次对于不可变類例如String等基本类型,赋值不变意味着引用不变;但是对于可变类例如常用Datefinal只要求保证引用不变,可其值可以进行改变再多说点,这也僦是为什么不可变类内用可变对象时要进行保护性拷贝的原因了

4、final优点。jvm会缓存final变量并进行优化;由于不可变保证线程安全

根据effctive java书中對于enum的介绍:java枚举类型的基本想法就是通过公有的静态final域为每个枚举常量导出实例的类。也即是说每个枚举类型都是 public static final的每个枚举都导出叻对应枚举的实例,再者枚举没有可访问的构造器枚举类型才是真正的final啊,才是真正的singleton比静态方法实现的单例模式好太多。。

你对這个回答的评价是

我要回帖

更多关于 asp给java参数赋值 的文章

 

随机推荐