首页 > 其他 > 详细

枚举类

时间:2020-10-16 17:17:00      阅读:21      评论:0      收藏:0      [点我收藏+]

一、如何自定义枚举类

  • 对象有个有限、确定个
  • 例子

技术分享图片

  • 定义一组常量时也建议使用枚举类
  • 如果枚举类中只有一个对象,则可以使用单例模式

二、 如何使用关键词enum定义枚举类

  • jdk5.0 前自定义
  • jdk5.0后enum定义

1. 自定义枚举类

  • 属性私有化、常量化——private final 修饰

    • 开始private final给属性会报错,因为常量没有值需要初始化
  • 构造器私有化——private 修饰

    • 有三种给属性初始化的方式
      • 直接属性赋值——定义完后不能修改,单例可以使用
      • 构造器赋值——可修改,如季节属性——春夏秋冬四个值,因此使用构造器初始化
      • 方法赋值set/get——可修改,定义的常量外部不能赋值,因此不用set/get
  • 提供枚举类的多个对象——public static final 修饰

    • 在枚举类内部实例化完,外部不用new直接调用对象
  • 其他诉求

    • 获取枚举类对象的属性

    • 提供toString的方法——因为默认打印地址值

      • System.out.println(spring);
        //输出结果为com.enumdemo.Season@1b6d3586而不是春天
        

1.1 例子

public class SeasonTest {
    public static void main(String[] args) {
        Season spring = Season.SPRING;//可以直接给spring用常量SPRING对象赋值
        System.out.println(spring.toString());

        String result = spring.getSeason();
        System.out.println(result);
    }
}
/*
        春天的描述:春暖花开
        春天
 */
public class Season {
    //属性私有化、常量化
    private final String season;
    private final String description;

    //构造器私有化
    private Season (String seasonName, String seasonDesc) {
       this.season  = seasonName;
       this.description = seasonDesc;
    }

    //实例化对象——公共、静态、常量
    public static final Season SPRING = new Season("春天","春暖花开");
    public static final Season SUMMER = new Season("夏天","夏日炎炎");
    public static final Season AUTUMN = new Season("秋天","秋高气爽");
    public static final Season WINTER = new Season("冬天","冰天雪顶");

    //其他诉求1 获取属性——季节名
    public String getSeason() {
        return season;
    }

    public String getDescription() {
        return description;
    }

    //其他诉求2 重写打印方法
    @Override
    public String toString() {
        return season+"的描述:" + description;
    }
}

2. enum定义

  • 通过Enum代替class去定义类

  • 实例化对象要第一个写——其余与自定义枚举类一样

    • //Enumd定义: 
      SPRING("春天","春暖花开"),
      SUMMER("夏天","夏日炎炎");
      //自定义   :  
      public static final Season SPRING = new Season("春天","春暖花开");
      public static final Season SUMMER = new Season("夏天","夏日炎炎");
      
      • 不用public static final修饰
      • 不用标明对象类型
      • 不同new关键词调用构造器
      • 多个对象之间用”,“代替";"

2.1 例子

public class Test {
    public static void main(String[] args) {
        Season1 spring = Season1.SPRING;
        
        //不用重写toString,父类已经重写好了
        System.out.println(spring);//SPRING
        
        System.out.println(spring.getSeason());//春天
        System.out.println(spring.getDescription());//春暖花开

        //说明定义的枚举类继承于父类java.lang.Enum
        System.out.println(Season1.class.getSuperclass());//class java.lang.Enum
    }
}
package com.enumdemo;

enum Season1 {
    //实例化对象
    SPRING("春天","春暖花开"),
    SUMMER("夏天","夏日炎炎"),
    AUTUMN("秋天","秋高气爽"),
    WINTER("冬天","冰天雪地");

    //私有化、常量化属性
    private final String season;
    private final String description;

    //私有化构造器
    private Season1(String seasonName, String seasonDesc) {
        season = seasonName;
        description = seasonDesc;
    }

    //其他诉求1——获取获取属性
    public String getSeason() {
        return season;
    }

    public String getDescription() {
        return description;
    }
}
  • 不重写toString也不会返回地址值,因为父类已经重写好了

    技术分享图片

三、Enum类的主要方法

  • values()——返回一个所有对象名组成的数组
  • valueOf(String str)
    • 返回一个enum类中与str相同的对象名
    • 如果enum类中没有该对象名则抛出异常illegalArgumentException
  • toString——返回对象名

1. 例子

public class Test {
    public static void main(String[] args) {

        //toString()
        Season1 spring = Season1.SPRING;
        System.out.println(spring);//SPRING

        //values()
        Season1[] array = Season1.values();
        System.out.println(Arrays.toString(array));
        //[SPRING, SUMMER, AUTUMN, WINTER]

        //value of()
        Season1 a = Season1.valueOf("SPRING");
        System.out.println(a);//SPRING

    }
}

四、实现接口的枚举类

  • 接口在enum类中实现抽象方法

  • 让枚举类的对象分别实现接口中的抽象方法

1. 接口重写方法

public class Test {
    public static void main(String[] args) {
        Season1 winter = Season1.WINTER;

        winter.show();
        //这是一个季节

    }
}
public interface SeasonInfo {
    void show();
}
enum Season1 implements SeasonInfo{
    //实例化对象
    SPRING("春天","春暖花开"),
    SUMMER("夏天","夏日炎炎"),
    AUTUMN("秋天","秋高气爽"),
    WINTER("冬天","冰天雪地");

    //私有化、常量化属性
    private final String season;
    private final String description;

    //私有化构造器
    private Season1(String seasonName, String seasonDesc) {
        season = seasonName;
        description = seasonDesc;
    }

    //其他诉求1——获取获取属性
    public String getSeason() {
        return season;
    }

    public String getDescription() {
        return description;
    }

    @Override
    public void show() {
        System.out.println("这是一个季节");
    }
}
  • 在enum类中重写了接口中的抽象show方法

2. 让每个对象各自实现接口中的抽象方法

public class Test {
    public static void main(String[] args) {
        Season1 winter = Season1.WINTER;

        winter.show();
        //大约在冬季

    }
}
public interface SeasonInfo {
    void show();
}
enum Season1 implements SeasonInfo{
    //实例化对象
    SPRING("春天","春暖花开"){
        @Override
        public void show() {
            System.out.println("春天在哪里");
        }
    },
    SUMMER("夏天","夏日炎炎"){
        @Override
        public void show() {
            System.out.println("宁夏");
        }
    },
    AUTUMN("秋天","秋高气爽"){
        @Override
        public void show() {
            System.out.println("秋天不回来");
        }
    },
    WINTER("冬天","冰天雪地"){
        @Override
        public void show() {
            System.out.println("大约在冬季");
        }
    };

    //私有化、常量化属性
    private final String season;
    private final String description;

    //私有化构造器
    private Season1(String seasonName, String seasonDesc) {
        season = seasonName;
        description = seasonDesc;
    }

    //其他诉求1——获取获取属性
    public String getSeason() {
        return season;
    }

    public String getDescription() {
        return description;
    }
}

枚举类

原文:https://www.cnblogs.com/Sheltonz/p/13825995.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!