解决之前遗留的问题之一:Java Enum的理解。
“最近在研究Shiro的过程中,碰到DefaultFilter的源码,是enum形式的。之前没见过这样的写法”。
public enum DefaultFilter { anon(AnonymousFilter.class), authc(FormAuthenticationFilter.class), authcBasic(BasicHttpAuthenticationFilter.class), logout(LogoutFilter.class), noSessionCreation(NoSessionCreationFilter.class), perms(PermissionsAuthorizationFilter.class), port(PortFilter.class), rest(HttpMethodPermissionFilter.class), roles(RolesAuthorizationFilter.class), ssl(SslFilter.class), user(UserFilter.class); private final Class<? extends Filter> filterClass; private DefaultFilter(Class<? extends Filter> filterClass) { this.filterClass = filterClass; } public Filter newInstance() { return (Filter) ClassUtils.newInstance(this.filterClass); } public Class<? extends Filter> getFilterClass() { return this.filterClass; } public static Map<String, Filter> createInstanceMap(FilterConfig config) { Map<String, Filter> filters = new LinkedHashMap<String, Filter>(values().length); for (DefaultFilter defaultFilter : values()) { Filter filter = defaultFilter.newInstance(); if (config != null) { try { filter.init(config); } catch (ServletException e) { String msg = "Unable to correctly init default filter instance of type " + filter.getClass().getName(); throw new IllegalStateException(msg, e); } } filters.put(defaultFilter.name(), filter); } return filters; } }
相关博客:http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html
1. enum本身无法再继承
2. enum可视为class的一种
3. enum默认有valueOf(),values()方法,其实类似于类的.class,具体可能深究JVM
4. enum相等用==
5. Java enum在经过编译后也会生成class文件,而且其经过反编译之后生成的类实际上继承了java.lang.Enum<E>
6. enum的实例必须提前列举! enum无法用构造函数new,构造函数是private的
7. 既然enum不能实例化,那么enum中的public方法不能使用(除了列举的现成的enum),只能使用public static的方法;