【java baisc】final 关键字和enum类

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


一、final修饰符


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

【java baisc】final 关键字和enum类_第1张图片

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

如下图:

【java baisc】final 关键字和enum类_第2张图片


二、枚举


在某些情况下,一个类的对象是有限的,并且是固定的。比如季节类,它有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类_第3张图片



三、枚举跟final修饰符关系?


枚举的jdk底层代码中,基本上都是用final关键字来修饰的,所以能够保证值不被改变。如下是部分jdk的枚举类的源码。

/**
 * 枚举的jdk底层代码中,90%的方都带着final关键字,如下
 * @param 
 */
public abstract class Enum>
        implements Comparable, 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包中定义的类是字典表的数据,比如课程类型、建筑类型、专业选修课等。但是因为现在字典表是有维护页面的,即用户可以添加。但是类中定义的枚举类又是固定了。如何做到枚举类跟字典表里面的数据同步,还是一个问题。这样使用枚举是否还合理,还需要进一步验证。


你可能感兴趣的:(【java baisc】final 关键字和enum类)