zoukankan      html  css  js  c++  java
  • 11.枚举类.md


    1.定义:

    2.枚举类和普通类的区别:

    • 枚举类的默认修饰符是 public static final
    • 每一个枚举值是
    • 枚举值是枚举值所属的类的数据类型,枚举值是指向本类的对象
    • 枚举类的默认构造是private,可以自定义,但必须private
    • 可以定义抽象方法,但是必须用枚举值实现
    • 枚举值必须在自定义成员变量之前

    使用要点

    • 在switch..case..中使用,case后面只需要枚举值不需要类.枚举值的形式

    2.1枚举类的简单构建:

    package com.company.project.enumTest;
    //SeasonEnum.java
    public enum SeasonEnum {
        SPRING, SUMMER, FALL, WINTER;
    }
    
    package com.company.project.enumTest;
    //EnumPrint.java
    public class EnumPrint {
        public void judge(SeasonEnum s){
            switch(s){
                case SPRING:
                {
                    System.out.println("Season is SPRING");
                    break;
                }
                case SUMMER:
                {
                    System.out.println("Season is SUMMER");
                    break;
                }
                case FALL:
                {
                    System.out.println("Season is FALL");
                    break;
                }
                case WINTER:
                {
                    System.out.println("Season is WINTER");
                    break;
                }
            }
        }
         
        public static void main(String[] args){
            //Enumeration class has the default values method, which returns all instances of the enumeration class
            for(SeasonEnum s : SeasonEnum.values()){
                System.out.println("Enum.values :" + s);
            }
             
            //
            new EnumPrint().judge(SeasonEnum.FALL);
        }
    }
    

    2.2枚举类的成员变量、方法和构造

    枚举类的成员变量:

    //Gender.java
    public enum Gender {
        MALE,FEMALE;
        public String name;
    }
    
    //GenderTest.java
    public class GenderTest {
     
        public static void main(String[] args) {
            //通过valueOf获取枚举类的枚举值
            Gender g = Enum.valueOf(Gender.class, "MALE");
            g.name = "男";
            System.out.println(g + "的枚举值是" + g.name);
        }
    }
    

    上述代码修改完善:

    //Gender.java
    public enum Gender {
        MALE,FEMALE;
        //definde a var
        //public String name;
        private String name;
     
        public String getName() {
            return this.name;
        }
     
        public void setName(String name) {
            switch(this){      
                case MALE:
                {
                    if (name.equals("男")) {
                        this.name = name;
                    }
                    else{
                        System.out.println("Error!");
                    }  
                    break;
                }//case MALE
                case FEMALE:{
                    if (name.equals("女")) {
                        this.name = name;
                    } else {
                        System.out.println("Error!");
                    }
                    break;
                }//case FEMALE
            }
        }
    }
    
    //GenderTest.java
    public class GenderTest {
     
        public static void main(String[] args) {
            //通过valueOf获取枚举类的枚举值
            Gender g = Enum.valueOf(Gender.class, "MALE");
            //g.name = "nan";
            g.setName("男");
            System.out.println(g + " Express " + g.getName());
            g.setName("女");
        }
     
    }
    

    最终的修改版本:枚举类通常应该被设计为不可改变的类,也就是说他的成员变量应该不可改变,建议将成员变量都用private final修饰:

    //Gender.java
    public enum Gender {
        //这里的男和女赋值,是直接调用了构造,只不过枚举类中的构造不需要new关键字,也不需要显示的构造调用
        MALE("男"),FEMALE("女");
        //定义为私有不可变
        private final String name;
        //类的构造
        private Gender(String name){
            this.name = name;
        }
        public String getName(){
            return this.name;
        }
    }
    
    //GenderTest.java
    public class GenderTest {
     
        public static void main(String[] args) {
            //通过valueOf获取枚举类的枚举值
            Gender g = Enum.valueOf(Gender.class, "MALE");
            System.out.println(g + "的枚举值是" + g.getName());
        }
    }
    

    2.3实现接口的枚举类

    //InterfaceGender.java
    public interface InterfaceGender {
        void Info();
    }
    
    //Gender.java
    public enum Gender implements InterfaceGender{
        //这里的男和女赋值,是直接调用了构造,只不过枚举类中的构造不需要new关键字,也不需要显示的构造调用
        MALE("男"),FEMALE("女");
        //定义为私有不可变
        private final String name;
        //类的构造
        private Gender(String name){
            this.name = name;
        }
        public String getName(){
            return this.name;
        }
         
        //接口方法
        @Override
        public void Info() {
            // TODO Auto-generated method stub
            System.out.println("接口的方法");
        }
    }
    
    //GenderTest.java
    public class GenderTest {
     
        public static void main(String[] args) {
            //通过valueOf获取枚举类的枚举值
            Gender g = Enum.valueOf(Gender.class, "MALE");
            System.out.println(g + "的枚举值是" + g.getName());
            g.Info();
        }
    }
    
    //Gender.java
    public enum Gender implements InterfaceGender{
        //这里的男和女赋值,是直接调用了构造,只不过枚举类中的构造不需要new关键字,也不需要显示的构造调用
        //并且用了匿名内部类来实现Info方法的重写
        MALE("男"){
            public void Info(){
                System.out.println("男性的重写方法实现");
            }
        },
         
        FEMALE("女"){
            public void Info(){
                System.out.println("女性的重写方法实现");       
            }
        };
        //定义为私有不可变
        private final String name;
        //类的构造
        private Gender(String name){
            this.name = name;
        }
        public String getName(){
            return this.name;
        }
    }
    

    main方法中的实现不变

    2.4包含抽象方法的枚举类

    //Calculate.java
    public enum Calculate {
        PLUS{
            public double CalculateNum(double a, double b){
                return a + b;
            }
        },
        MINUS{
            public double CalculateNum(double a, double b){
                return a - b;//do not check num
            }
        },
        TIMES{
            public double CalculateNum(double a, double b){
                return a * b;
            }
        },
        DIVIDE{
            public double CalculateNum(double a, double b){
                return a / b;//do not check num
            }
        };
        public abstract double CalculateNum(double a, double b);
    }
    
    //CalculatePrint.java
    public class CalculatePrint {
     
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            System.out.println(Calculate.PLUS.CalculateNum(1, 2));
            System.out.println(Calculate.MINUS.CalculateNum(1, 2));
            System.out.println(Calculate.TIMES.CalculateNum(1, 2));
            System.out.println(Calculate.DIVIDE.CalculateNum(1, 2));
        }
     
    }
    
  • 相关阅读:
    springboot 项目添加jaeger调用链监控
    使用Maven插件快捷打包发布远程Docker镜像 dockerfile-maven-plugin
    glide install失败 Update failed for golang.org/x/net: Cannot detect VCS
    Docker 修改默认存储位置
    istio 服务地图
    istio收集Metrics和日志信息
    istio分布式调用链Jaeger
    prometheus 通过企业微信接收告警
    prometheus alert rules文件格式化
    Effective C++ 笔记二 构造/析构/赋值运算
  • 原文地址:https://www.cnblogs.com/bugstar/p/8492501.html
Copyright © 2011-2022 走看看