Java枚举类学习笔记和设置不可变类

本文探讨了Java中的枚举类,包括创建、枚举与普通类的区别、如何与switch和for循环结合使用,以及实现接口的枚举类。此外,还详细讲解了如何设置不可变类,强调了不可变类的特性如属性的private和final修饰、提供getter方法而不设setter,以及可能需要重写hashCode和equals方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

枚举类

枚举类创建

    public enum TrafficSignal {
    STOP, CAUTION, GO;
    }

这就是一个基本的枚举类创建,定义了一个名为 TrafficSignal 的枚举类,里面隐式创建了3个静态的(static),不可变的(final)类对象STOP、CAUTION、GO。
因为对象已静态创建,所以使用枚举类对象时用类名调用即可 eg:

TrafficSignal.STOP;
    TrafficSignal.CAUTION;
    TrafficSignal.GO;

当然,枚举类值还可以是null
作为类,枚举类可往里边再加一些成员 属性方法构造器

    public class Test {
        //把枚举类定义为成员内部类
        public enum TrafficSignal {

            //用有参构造器创建对象,即枚举值
            STOP("red"), CAUTION("yellow"), GO("green");
            /*相当于普通类的
            public static final TrafficSignal STOP = new TrafficSignal("red");
            */

            //定义属性 属性设置为private和final来不让外部访问和修改属性,因为枚举值不能被修改
            private final String light;

             //定义带参构造器 构造器设为私有来不让其他类创建新的该枚举类对象
            private TrafficSignal(String t) {
                 light = t;
            }
            //定义方法 还可以定义访问器和修改器
            public String format(String message) {
                 return message + " " + light;
            }
        }   

        public static void main(String[] args) {
        System.out.println(TrafficSignal.GO.format("The light is"));
        System.out.println(TrafficSignal.STOP.format("The light is"));
        }
    }

枚举类与普通类区别

-枚举类可实现一个或多个接口,使用enum定义的枚举类默认继承java.lang.Enum类(实现了java.lang.Serializable和java.lang.Comparable接口),而非Object类;
-枚举类构造器只能用private修饰,省略则默认private;
-枚举类所有实例须显示列出,中间用逗号 “,” 隔开,最后一个后用分号“ ; ”;
-所有枚举类都提供values方法,用来遍历所有枚举值;

和switch、增强for,一起使用

public class Test {
    public enum TrafficSignal {
        STOP, CAUTION, GO;
        };

    public static void main(String[] args) {
        TrafficSignal theLight = TrafficSignal.GO;
        switch (theLight) {
          case STOP:   //case后放枚举值,前面不用类名或对象标注
             System.out.print("red");
             break;
          case CAUTION:
             System.out.print("yellow");
             break;
          case GO:
             System.out.print("green");
             break;
        }
            //使用values遍历
        for (TrafficSignal t : TrafficSignal.values()) {
         System.out.println(t);
        }
    }
}

实现接口的枚举类

可使用匿名内部类

public enum TrafficSignal implements TrafficSignalDesc{

    //用有参构造器创建对象,即枚举值
    //使用匿名内部类
    STOP("red")
    {
        public void info()
        {
            System.out.println("这个枚举值代表红灯");
        }
    }, 
    CAUTION("yellow")
    {
        public void info()
        {
            System.out.println("这个枚举值代表黄灯");
        }
    },
     GO("green")
     {
        public void info()
        {
            System.out.println("这个枚举值代表绿灯");
        }
    },;

    //定义属性 属性设置为private和final来不让外部访问和修改属性,因为枚举值不能被修改
    private final String light;

     //定义带参构造器 构造器设为私有来不让其他类创建新的该枚举类对象
    private TrafficSignal(String t) {
         light = t;
    }
        //定义方法 还可以定义访问器和修改器
    public String format(String message) {
         return message + " " + light;
    }

    public static void main(String[] args) 
    {
        TrafficSignal g = Enum.valueOf(TrafficSignal.class , "GO");
        //使用从接口实现的方法
        g.info();
    }
} 

public interface TrafficSignalDesc
{
    void info();
} 

包含抽象方法的枚举类

使用含抽象方法的枚举类即在类里定义抽象方法,定义类时enum前不用加abstract,然后可用匿名内部类方式覆写(与实现接口覆写方式一样)

设置不可变类

  1. 用private和final修饰符修饰该类属性;
  2. 提供带参构造器,用于根据传入参数初始化类的属性;
  3. 仅为该类属性提供访问器getter方法,不提供修改器setter;
  4. if necessary,重写Object类的hashCode和equals方法(两者结果须一致);

不可变类:8个包装类,String类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值