首页 > 其他分享 >Enum01_都有常量了为何要有枚举类

Enum01_都有常量了为何要有枚举类

时间:2023-06-08 09:36:51浏览次数:32  
标签:Enum01 常量 Season final println 枚举 static Season2 public

​ 我们在不引入 ENUM 的情况下使用 Integer (String 啥的肯定也可以)定义四个不同的季节,由于这个是 static 和 final 的,肯定是能通过类 OGNL 直接调用且不能被改变的。

public class Season {
    /**
     * 使用 Integer 来定义春夏秋冬(其他类型是自然可以)
     */
    public static final int SPRING = 1;
    public static final int SUMMER = 2;
    public static final int AUTUMN = 3;
    public static final int WINTER = 4;
    /**
     * 定义静态常量可以在其它类中直接通过类名 OGNL 语句调用
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(Season.SPRING);
        System.out.println(Season.SUMMER);
        System.out.println(Season.AUTUMN);
        System.out.println(Season.WINTER);
    }

    

​ 如果我们根据 Season 的值来区分不同的逻辑,假设为 方法 fun(),参数为 int 类型,但是我们用的时候只要传入一个 INT 值就可以了,当然你也可以写上范围,或者进行逻辑判断,但是对于使用者就不是很友好。

	/**
     *
     * @param season
     * 只要传递int就可以
     */
//可能出现的情况

	fun(Season.Spring);
	fun(3);
    fun(4);
    fun(100);

    public static void fun(int season) {
        switch (season) {
            case 1:
                System.out.println(1);
                break;
            case 2:
                System.out.println(2);
                break;
            case 3:
                System.out.println(3);
                break;
            default:
                System.out.println(4);
        }
    }
}

​ 如果对于 Season 类,我们里面的成员都改成 Season 类型的,并且把类加上 final 修饰(防止继承),把构造器写成 private 的(防止外部实例化),然后在将 fun() 函数的参数改为 Season 类型的 ,这样就可以限制我在使用这个方法的时候只能传入 Season 类型,而且我这个类还是写死的,也不能 new 对象,我里面写了什么你就只能用什么,直接就在根源限制了你要传入的参数,况且 IDE 会给你提醒你要传入个什么东西。

public final class Season2 {
    /**
     * 保证季节类型只会有这些常量
     */
    public static final Season2 SPRING = new Season2();
    public static final Season2 SUMMER = new Season2();
    public static final Season2 AUTUMN = new Season2();
    public static final Season2 WINTER = new Season2();

    private Season(){}

    public static void fun2(Season2 season){
        //方法体
    }

    public static void main(String[] args) {
        fun2(Season2.AUTUMN);
        fun2("SPRING");
    }
}

​ 下面是改造过后的

image-20230602213305981

​ 这就是 ENUM 的设计原理,下面代码通过 javap 后得到的与我们的 Season2 基本一致,且 ENUM 本身就是一个类,所以限制了传入类型,但是我们只能通过 enum 关键字让我们的自定义枚举继承 ENUM 类,这是 java 的规范。

public enum SeasonEnum {
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER
}

image-20230602213617568

标签:Enum01,常量,Season,final,println,枚举,static,Season2,public
From: https://www.cnblogs.com/purearc/p/17465216.html

相关文章

  • 2023年6月3日,枚举,枚举底层实现
    1.枚举1.枚举枚举是一种受限制的类,枚举第一行必须创建对象,枚举不能显示继承父类(枚举没有父类),所有的自定义枚举类默认继承Enum类packagecom.wz.enum01;publicenumSeason{spring("春天","春雨绵绵"),summer("夏天","烈日炎炎"),autumn("秋天","硕果累累"),......
  • 域用户枚举和密码喷洒攻击横向移动
    域用户枚举和密码喷洒攻击横向移动目录域用户枚举和密码喷洒攻击横向移动一、域内用户枚举攻击原理二、域内用户枚举工具三、密码喷洒攻击原理四、密码喷洒工具一、域内用户枚举攻击原理正常域用户登录主机,我们可以通过"netuser/domain"来列举出域内的用户。但是当我们用非......
  • 1821D - Black Cells(暴力贪心枚举)
    大意加思路:相当于有一个绳子,其中有n段可以上色,如果要给一段上色代价增加2,没向前走一步代价加一,可以看出代价最多可以去对掉长度为一的段落,因为最后要给x个点上色代价做少为x,而前面的段落给1个点上色代价最少为2,另外要考虑最后一段可能没有完全上色。点击查看代码#include<bits/......
  • [C++学习] 整型常量
    C++中二进制以0b开头,如0b00001011(值为11);八进制以0开头,如0013(值为11);十六进制以0x开头,如0x001a(值为26);注意:C++中cout是默认将数据以十进制输出,如果要将数据以八进制,十六进制输出应在前面加oct或hex;如:cout<<oct<<0123<<endl; //输出123cout<<hex<<0x1e<<en......
  • NEFU 635(二分+枚举)
    题目:TwinkleTwinkleLittleStar 题意:就是给n个点的坐标,然后在这个图形中找出一个边长最小的正方形,要求正方形的边平行于坐标轴且覆盖的点大于等于k个。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>usingnamespacestd;constintN=20......
  • Java中枚举类的特殊用法-使用枚举实现单例模式和策略模式
    场景设计模式-单例模式-饿汉式单例模式、懒汉式单例模式、静态内部类在Java中的使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127555096设计模式-单例模式-注册式单例模式-枚举式单例模式和容器式单例模式在Java中的使用示例:https://blog.csdn.net/BAD......
  • ACM-ICPC Nanjing Onsite 2018 - K(随机枚举+四维bfs)
    题目链接:https://nanti.jisuanke.com/t/33680 解题思路:随机两个袋鼠的位置,使得让他们相遇,那么这个操作就是一个四维的bfs,前两维代表第一只袋鼠的位置,后两维表示第二只袋鼠的位置。这样随机枚举最多是N*M次。所以时间复杂度最最最最坏情况也就O(N^3*M^3)。 #include<bits/stdc+......
  • 认识枚举
         ......
  • Problem F: 时间类的常量
    HomeWebBoardProblemSetStandingStatusStatisticsProblemF:时间类的常量TimeLimit:4Sec  MemoryLimit:128MBSubmit:2103  Solved:1715[Submit][Status][WebBoard]Description封装一个时间类Time,用于时间处理的相关功能,支持以下操作:......
  • C语言编程—枚举
    枚举是C语言中的一种基本数据类型,用于定义一组具有离散值的常量。它可以让数据更简洁,更易读。枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性。定义一个枚举类型,需要使用enum关键字,后面跟着枚举类型的名称,以及用大括号{}括起来的一组枚举常量。......