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上没有。

原文地址:https://www.cnblogs.com/cherishBlueSky/p/9178885.html