Java中的枚举Enum

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010469514/article/details/82559939

一、什么情况下使用枚举

有时候一个类的对象有限且固定时,建议使用枚举

二、为什么要用枚举替代静态常量

    public static final int SEASON_SPRING = 1;
    public static final int SEASON_SUMMER = 2;
    public static final int SEASON_FALL = 3;
    public static final int SEASON_WINTER = 4;

枚举类更加直观,类型安全。使用常量会有以下几个缺陷:

1. 类型不安全。若一个方法中要求传入季节这个参数,用常量的话,形参就是int类型,开发者传入任意类型的int类型值就行,但是如果是枚举类型的话,就只能传入枚举类中包含的对象。

2. 没有命名空间。开发者要在命名的时候以SEASON_开头,这样另外一个开发者再看这段代码的时候,才知道这四个常量分别代表季节。

三、枚举类入门

public enum SeasonEnum {
    SPRING,SUMMER,FALL,WINTER;
}

1. enum和class、interface的地位一样
2. 使用enum定义的枚举类默认继承了java.lang.Enum,而不是继承Object类。枚举类可以实现一个或多个接口,由于java的单继承性,枚举不能继承其他类。
3. 枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器自动添加public static final修饰
4. 使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承。
5. 枚举类的构造器是私有的。

四、枚举类介绍

枚举类内也可以定义属性和方法,可是是静态的和非静态的

public enum SeasonEnum {
    SPRING("春天"),SUMMER("夏天"),FALL("秋天"),WINTER("冬天");
    
    private final String name;
    
    private SeasonEnum(String name)
    {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

 实际上在第一行写枚举类实例的时候,默认是调用了构造器的,所以此处需要传入参数,因为没有显式申明无参构造器,只能调用有参数的构造器。

  构造器是私有的,这样就不能在别处申明此类的对象了。枚举类通常应该设计成不可变类,它的Field不应该被改变,这样会更安全,而且代码更加简洁。所以我们将Field用private final修饰。

五、枚举实现接口

枚举类可以实现一个或多个接口。与普通类一样,实现接口的时候需要实现接口中定义的所有方法,可以统一在枚举类中实现,也可以分别在枚举的每个实例中实现。

枚举类中也可以有抽象方法,枚举实例必须实现抽象方法

public enum Operation {
    PLUS{

        @Override
        public double eval(double x, double y) {
            return x + y;
        }
        
    },
    MINUS{

        @Override
        public double eval(double x, double y) {
            return x - y;
        }
        
    },
    TIMES{

        @Override
        public double eval(double x, double y) {
            return x * y;
        }
        
    },
    DIVIDE{

        @Override
        public double eval(double x, double y) {
            return x / y;
        }
        
    };
    
    /**
     * 抽象方法,由不同的枚举值提供不同的实现。
     * @param x
     * @param y
     * @return
     */
    public abstract double eval(double x, double y);
    
    public static void main(String[] args) {
        System.out.println(Operation.PLUS.eval(10, 2));
        System.out.println(Operation.MINUS.eval(10, 2));
        System.out.println(Operation.TIMES.eval(10, 2));
        System.out.println(Operation.DIVIDE.eval(10, 2));
    }
}

六、switch语句里的表达式可以是枚举值

case表达式中直接写入枚举值,不能加入枚举类作为限定。

    public void judge(SeasonEnum s)
    {
        switch(s)
        {
            case SPRING:
                System.out.println("春天适合踏青。");
                break;
            case SUMMER:
                System.out.println("夏天要去游泳啦。");
                break;
            case AUTUMN:
                System.out.println("秋天一定要去旅游哦。");
                break;
            case WINNER:
                System.out.println("冬天要是下雪就好啦。");
                break;
        }
    }

猜你喜欢

转载自blog.csdn.net/u010469514/article/details/82559939