struts2源码感悟
感觉泛型用得比较多,在ArrayUtils类里面:
public static <T> Set<T> asSet(T... element) {
HashSet<T> elements = new HashSet<T>(element.length);
Collections.addAll(elements, element);
return elements;
}
看到Enumeration这个类觉得面生,但又用得不少,翻看源码:
public interface Enumeration<E> {
boolean hasMoreElements();
E nextElement();
}
,这个不多做解释,直接翻到Iterator的源码,
/**
* An iterator over a collection. {@code Iterator} takes the place of
* {@link Enumeration} in the Java Collections Framework. Iterators
* differ from enumerations in two ways:
* 1. Iterators allow the caller to remove elements from the
* underlying collection during the iteration with well-defined
* semantics.
* 2. Method names have been improved.
*
* @author Josh Bloch
* @see Collection
* @see ListIterator
* @see Iterable
* @since 1.2
*/
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
删掉了部分注释,大意是:
1. Iterator取代了Enumeration,并添加了remove方法;
2.Iterator对方法名做了优化。
所以我们可以简单地理解,Enumeration就是Iterator的早期版,但由于遍历确实比Iterator快,所以在不需要删除功能和fail-fast功能的时候,用Enumeration遍历更快。
网上可看到的信息,还有一个区别是Iterator支持fail-fast,我不清楚,先略过。
再看两段代码,
public enum Flag{one,more}
&
public @interface Dic {
public enum CacheNameEnum{
CA_ADMIN("ca_admin"),
CA_TIME("time");
private String mapId;
public String getMapId() {
return mapId;
}
CacheNameEnum(String mapId) {
this.mapId = mapId;
}
}
CacheNameEnum[] key();
boolean cache() default false;
String handler() default "";
}
这里出现了一个enum,那它和Enumeration有什么区别和联系呢?
enum是一种特殊的数据类型,Enumeration是一个接口类。先说说enum怎么使用吧,
tips:enum不能作为包名。

public enum EnumTest {
MONDAY,TUESDAY;
public void doPost(){
}
}
1、enum可以替代class声明一个类,也可放在类的内部;
2、enum声明的常量最好大写,逗号分隔;
3、不另外定义方法,可以不在末尾加分号,定义方法需要加分号;
public class EnumTest {
enum Day {
MONDAY,TUESDAY;
public String name;
public void doPost(){
System.out.println("name: " + this.name);
}
}
public static void main(String[] args){
Day.MONDAY.doPost();
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.MONDAY.name());
System.out.println(Day.MONDAY);
}
}
,打印结果:

使用方法介绍完毕,大致明了,总结下。
1、enum类型实际上继承自Enum类,是一种限定对象实例个数的类类型;
2、Enum类自带两个属性,ordinal和name,name是定义的常量的名称,oridinal同常量定义顺序,从0开始;
3、可以自定义属性,定义构造方法,如Dic类。
for(Day day : EnumSet.range(Day.MONDAY,Day.THURSDAY)) {
System.out.println(day);
}
可以用EnumSet遍历指定段的Enum对象。
java1.7的switch语句加入了对enum的支持,我大胆猜测,内部实现应该是比对enum的oridinal值。
这篇文章写得贼好,特别深: https://blog.csdn.net/javazejian/article/details/71333103
里面讲到单例模式的实现,写得特别好,我打算另外写篇博客整理下,这里就不赘述了,主要代码就是:
/**
* Created by wuzejian on 2017/5/9.
* 枚举单例
*/
public enum SingletonEnum {
INSTANCE;
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
但这篇文章讲到,反编译enum类的代码后,可以看到继承了Enum类,java1.7上没有。

浙公网安备 33010602011771号