最近代码走查验收,讨论中提到了final Static 跟枚举类的使用,需要梳理一下。
一、final修饰符
final关键字用于修饰类/变量/方法,用于表示它修饰的类/方法/变量不可修改。
final修饰变量,表示该变量一旦获得了初始值,就不可以被修改。即可以修饰局部便变量,也可以修改成员变量。 1.成员变量 和普通成员变量不同,final成员变量必须由程序员显示声明,系统不会对final成员进行隐式初始化 2.局部变量 final修饰局部变量,既可以在定义时指定默认值,也可以不指定默认值。 如果定义时无指定,则可在后面代码中对该final变量赋值。但只能够赋值一次,不能重复赋值。 如果定义时已经指定,则在后面代码中不可再赋值.
如下图:
二、枚举
在某些情况下,一个类的对象是有限的,并且是固定的。比如季节类,它有4个对象,比如,星期类,一周有5天。这种实例是有限的并且是固定的类,在java里面称为枚举类。
1.定义一个枚举类
public enum SessionEnumTest { //在第一行列出4个枚举类,并且为其赋值 spring("1"),summer("2"),fall("3"),winter("4"); private String name; private SessionEnumTest (String name){ this.name=name; } public String getName(){ return this.name; } }
其中spring("1")其实相当于如下一行代码。
public static final SessionEnumTest spring = new SessionEnumTest("1");2.枚举测试类
public class testEnum { public static void main(String[] args){ //测试1,打印所有的枚举实例 for(SessionEnumTest s:SessionEnumTest.values()){ System.out.println(s); } //测试2.获取枚举值 SessionEnumTest test =SessionEnumTest.valueOf(SessionEnumTest.class,"spring"); //获取spring代表的实际值,正确应打印出"1" System.out.println("==========="+test.getName()); } }
3.执行效果
三、枚举跟final修饰符关系?
枚举的jdk底层代码中,基本上都是用final关键字来修饰的,所以能够保证值不被改变。如下是部分jdk的枚举类的源码。
/** * 枚举的jdk底层代码中,90%的方都带着final关键字,如下 * @param <E> */ public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable { private final String name; public final String name() { return name; } private final int ordinal; public final int ordinal() { return ordinal; } protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } public String toString() { return name; } public final boolean equals(Object other) { return this==other; } public final int hashCode() { return super.hashCode(); } protected final Object clone() throws CloneNotSupportedException { throw new CloneNotSupportedException(); } // ............ } 小结
我看了看itoo.tool.business包里定义的枚举类,基本上也是这样的实现。但是还有一个问题,bussiness包中定义的类是字典表的数据,比如课程类型、建筑类型、专业选修课等。但是因为现在字典表是有维护页面的,即用户可以添加。但是类中定义的枚举类又是固定了。如何做到枚举类跟字典表里面的数据同步,还是一个问题。这样使用枚举是否还合理,还需要进一步验证。
