【java baisc】final 关键字和enum类

时间:2020-12-26 18:20:16

 最近代码走查验收,讨论中提到了final Static 跟枚举类的使用,需要梳理一下。


一、final修饰符


final关键字用于修饰类/变量/方法,用于表示它修饰的类/方法/变量不可修改。

【java baisc】final 关键字和enum类

final修饰变量,表示该变量一旦获得了初始值,就不可以被修改。即可以修饰局部便变量,也可以修改成员变量。
1.成员变量
和普通成员变量不同,final成员变量必须由程序员显示声明,系统不会对final成员进行隐式初始化
2.局部变量
final修饰局部变量,既可以在定义时指定默认值,也可以不指定默认值。
如果定义时无指定,则可在后面代码中对该final变量赋值。但只能够赋值一次,不能重复赋值。
如果定义时已经指定,则在后面代码中不可再赋值.

如下图:

【java baisc】final 关键字和enum类


二、枚举


在某些情况下,一个类的对象是有限的,并且是固定的。比如季节类,它有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.执行效果


【java baisc】final 关键字和enum类



三、枚举跟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包中定义的类是字典表的数据,比如课程类型、建筑类型、专业选修课等。但是因为现在字典表是有维护页面的,即用户可以添加。但是类中定义的枚举类又是固定了。如何做到枚举类跟字典表里面的数据同步,还是一个问题。这样使用枚举是否还合理,还需要进一步验证。