重新认识枚举enum

【攻击面测绘利器】Amass 实战:从子域名枚举到资产地图构建 本文深入解析了OWASP Amass作为攻击面测绘利器的实战应用,超越了传统的子域名枚举功能。文章详细阐述了如何通过Intel、Enum和Viz三大核心模块,系统性地从发现关联资产、深度枚举到构建可视化资产地图,实现从被动信息收集到主动攻击面管理的完整工作流,并分享了自动化监控与避坑的最佳实践。 阅读详情

定义

在 Java 中,enum(枚举)是一种特殊的类,用于定义固定数量的常量集合。它从 JDK 5(Java 1.5) 开始引入,目的是替代传统的 public static final int 常量,提供类型安全、可读性强、功能丰富的常量管理方式

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

扩展

public enum Day {
    MONDAY("MONDAY", 0), 
    TUESDAY("TUESDAY", 1);
}

相当于

public final class Day extends java.lang.Enum<Day> {
    public static final Day MONDAY = new Day("MONDAY", 0);
    public static final Day TUESDAY = new Day("TUESDAY", 1);
    // ... 其他常量

    private Day(String name, int ordinal) {
        super(name, ordinal);
    }

    public static Day[] values() { /* 返回所有常量 */ }
    public static Day valueOf(String name) { /* 根据名字返回常量 */ }
}

主要使用场景

  • 表示一组固定的常量, 这是枚举最核心的用途——代替 public static final 常量,让代码更类型安全、更可读

  • 替代魔法值(Magic Number/String)

// ❌ 魔法值
if (status == 1) { ... }

// ✅ 枚举
if (status == OrderStatus.PAID) { ... }
  • 状态机(State Machine)枚举非常适合表示有限的状态流转,比如订单状态、审批流程等。
public enum OrderStatus {
    CREATED, PAID, SHIPPED, DELIVERED, CANCELLED
}

public class Order {
    private OrderStatus status;
    
    public void pay() {
        if (status == OrderStatus.CREATED) {
            status = OrderStatus.PAID;
        }
    }
}
  • 单例模式(Singleton)
public enum Singleton {
    INSTANCE;
    
    public void doSomething() {
        // ...
    }
}

// 使用
Singleton.INSTANCE.doSomething();

内置常用方法

方法作用示例
values()返回所有常量数组Day[] days = Day.values();
valueOf(String)根据名称返回常量Day d = Day.valueOf("MONDAY");
ordinal()返回声明索引Day.MONDAY.ordinal() → 0
name()返回常量名称Day.MONDAY.name() → "MONDAY"
compareTo()按声明顺序比较MONDAY.compareTo(TUESDAY) → -1

常用方法


public enum Day {

    //    枚举常量必须放第一行
    MONDAY("MONDAY", 0),
    TUESDAY("TUESDAY", 1);
    // 静态字段写在枚举常量之后
    public static String dayName = "星期";

    private String code;
    private int value;

    public Day(String code, int value) {
        this.code = code;
        this.value = value;
    }

    public String getCode() {
        return this.code;
    }
    public int getValue() {
        return this.value;
    }
    // 根据code 获取对应value
    public Integer getDayValByCode(String code) {
        for(Day d : Day.values()) {
            if (d.code.equals(code)) {
                return d.value;
            }
        }
        // 这里想返回null 就要用Integer 不能用int
        return null;
    }
}

在 Java 中,枚举类(enum)的构造函数参数数量没有硬性限制

public enum Planet {
    EARTH(1, "blue", 9.8, true, "Solar System", ...); // 理论上可继续添加

    Planet(double mass, String color, double gravity, boolean habitable, String system /*, ...*/) {
        // 构造逻辑
    }
}
问题说明
代码可读性崩溃超过 5-10 个参数已难以维护(违反 Clean Code 原则)
编译错误某些 IDE 或编译器可能提前报错(如 Eclipse 限制方法参数 ≤ 255,但实际更早失败)
字节码膨胀大量参数导致 .class 文件臃肿

添加字段,构造方法等

在 Java 中,enum(枚举)不仅可定义常量列表,还可以像普通类一样:

  • 添加字段(成员变量)
  • 定义构造函数
  • 声明方法(包括抽象方法)
  • 实现接口
    这使得 enum 非常强大,适用于需要为每个常量附加数据或行为的场景。
public enum Planet {
    // 枚举常量(必须在最前面,调用构造函数)
    MERCURY(3.303e+23, 2.4397e6),
    VENUS  (4.869e+24, 6.0518e6),
    EARTH  (5.976e+24, 6.37814e6),
    MARS   (6.421e+23, 3.3972e6);

    // 字段(通常为 private final)
    private final double mass;      // 质量(kg)
    private final double radius;    // 半径(m)

    // 构造函数(只能是 private 或 package-private,默认 private)
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }

    // 方法
    public double getMass() { return mass; }
    public double getRadius() { return radius; }

    // 计算表面重力:g = G * M / r^2
    public double surfaceGravity() {
        return 6.67300E-11 * mass / (radius * radius);
    }

    // 计算某物体在该星球上的重量
    public double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
}
public class Main {
    public static void main(String[] args) {
        Planet earth = Planet.EARTH;
        System.out.println("Earth's gravity: " + earth.surfaceGravity());
        System.out.println("My weight on Mars: " + Planet.MARS.surfaceWeight(70)); // 70kg 人在火星的重量
    }
}

内置常用方法

高级用法:每个常量有不同行为(抽象方法)

public enum Operation {
    PLUS {
        public double apply(double x, double y) { return x + y; }
    },
    MINUS {
        public double apply(double x, double y) { return x - y; }
    },
    TIMES {
        public double apply(double x, double y) { return x * y; }
    },
    DIVIDE {
        public double apply(double x, double y) { return x / y; }
    };

    // 抽象方法 → 每个常量必须实现
    public abstract double apply(double x, double y);
}
double result = Operation.PLUS.apply(5, 3); // 8.0
特性说明
枚举常量必须在第一行所有 CONSTANT(...) 必须出现在字段/方法之前
构造函数只能是 private不能 public 或 protected(防止外部 new)
字段建议用 final枚举常量通常是不可变的
可以实现接口enum MyEnum implements Runnable { ... }
不能继承其他类因为 enum 隐式继承 java.lang.Enum(Java 不支持多继承)
可以有静态方法/字段如 values(), valueOf(String) 是自动生成的

总结

Java 的 enum 远不止是“常量集合”,它是一个功能完整的类,支持:
字段 + 构造函数 + 方法 + 接口 + 多态行为
合理使用能让代码更安全、清晰、可维护,是 Java 中被低估的强大特性。

MySQL数据类型选择与优化实战指南 数据类型是关系型数据库设计的核心要素,直接影响存储效率与查询性能。从底层原理看,MySQL通过不同的存储格式和长度标识实现类型优化,如整数类型的字节节省、DECIMAL的精确计算机制。合理选择数据类型能显著提升系统性能,例如用TINYINT替代VARCHAR存储状态字段可节省50%空间,JSON类型比TEXT节省30%存储。典型应用场景包括金融系统必须使用DECIMAL保证精度,UTF8MB4字符集需注意中文字符存储开销,以及空间数据采用R树索引优化GIS查询。本文重点解析数值、字符串、时间等类型的实战避坑 阅读详情

相关推荐

Nmap深度指南:从端口扫描到网络空间情报收集的实战艺术

端口扫描是网络安全与渗透测试的基础技术,其核心原理是通过向目标主机发送特定网络数据包,分析响应以探测网络服务、主机状态及拓扑结构。这项技术不仅帮助安全人员识别潜在攻击面,更是构建网络资产清单、评估风险的关键环节。在渗透测试、红蓝对抗及日常安全运维中,精准的端口与服务识别能力,能极大提升威胁发现与漏洞评估的效率。Nmap作为该领域的标杆工具,其强大的脚本引擎和灵活的扫描策略,使其成为从基础信息收集到深度漏洞探测的综合性平台。掌握Nmap的扫描技术与规避手段,是每一位安全从业者提升实战能力、应对复杂网络环境的必

weixin_33874713的博客 501

重新认识java(十) ---- Enum(枚举类)

本文转载:原文地址:  重新认识java(十) ---- Enum(枚举类)  

dear_Alice_moon的专栏 320

C++11核心特性解析:移动语义、智能指针与并发编程实战

在C++编程语言的发展历程中,资源管理与并发控制是两大核心挑战。传统C++依赖手动内存管理和操作系统特定的线程API,容易导致内存泄漏和数据竞争等问题。C++11标准通过引入RAII(资源获取即初始化)范式,从根本上改变了资源管理的方式。其中,移动语义通过右值引用实现了高效的资源所有权转移,避免了不必要的拷贝开销;智能指针(如std::unique_ptr和std::shared_ptr)自动化了内存生命周期管理,显著提升了代码的安全性。同时,标准库首次内置了线程、互斥量、条件变量等并发组件,为多核编程提供

weixin_30568591的博客 330

重新认识enum枚举类

public enum EnumTest implements Cloneable { ...... } 就像所有的类都默认继承了 java.lang.Object 一样,所以的枚举类 都默认继承了 java.lang.Enum。虽然语法上是通过关键字 enum 声明一个类是枚举类,但实际上 还是使 被声明类 继承了 java.lang.Enum。所以在语法上,枚举类不能 再使用 ext...

Nicholas.S的博客 278

Kali Linux红队实战:从工具使用到渗透测试全流程思维构建

渗透测试是网络安全领域的核心实践,旨在通过模拟真实攻击来评估系统防御的有效性。其基本原理遵循标准化的生命周期,从情报收集、威胁建模到漏洞利用与后渗透,形成一个闭环的攻防验证流程。这项技术的核心价值在于将安全风险从抽象概念转化为可验证、可度量的具体路径,从而为企业的安全建设提供精准的改进依据。在工程实践中,Kali Linux作为集成了数百款安全工具的平台,是实现这一流程的关键载体。通过掌握其模块化工具集,如信息收集阶段的Nmap与Metasploit框架,安全从业者能够系统性地进行漏洞分析与攻击模拟,最终将

weixin_30607029的博客 361

VirtualBox安装Win10虚拟机超详细教程(附微软官方镜像下载)

本文提供了一份详细的VirtualBox安装Win10虚拟机教程,涵盖从环境准备、工具下载到系统安装与初始配置的全过程。特别推荐使用微软官方镜像下载,确保系统纯净安全。此外,还分享了性能优化技巧和常见问题解决方案,帮助用户高效搭建稳定的Windows测试环境。

weixin_29243279的博客 918

Enum枚举类的使用

重新认识java(十) ---- Enum(枚举类)

他 218

Welch 方法详解:一种经典而实用的功率谱密度估计方法

在信号处理领域,谱分析是用于分析信号频率内容的强大工具。Welch方法是现代谱分析中一种广泛使用的功率谱密度估计技术,由Peter D. Welch在1967年提出。它通过对信号进行分段、加窗和平均化处理,提供了一种平滑且稳定的频谱估计方法。Welch方法通过将信号分成多个重叠的段,每段应用窗函数,然后计算每段的周期图,最后对所有周期图进行平均化,得到平滑的功率谱密度估计。welch_psd函数接收信号x、采样频率fs、每段的样本数N、重叠样本数overlap和窗函数类型window。

DuHz的博客 7042

面试准备之枚举类型enum的介绍

枚举类型enum并不是面试里面的一个常考点,但是为什么要给枚举写一篇博客呢,因为我简历上自己在项目中运用了枚举,11月11号在面试的时候,让我写一个枚举,我竟然没有写出来,当时就觉得很不好意思,所以这里将自己对枚举的重新认识记录一下。 一.最简单的枚举例子 enum Status{ NORMAL(1),STOP(0),DELETE(-1); public Integer g...

屌丝程序员的奋斗之路 837

UR5 机械臂手眼标定(Eye-in-Hand)实战:OpenCV 求解 AX=XB,误差 < 2mm

本文详细介绍了UR5机械臂在Eye-in-Hand配置下的手眼标定实战,通过OpenCV实现高精度标定,最终达到误差小于2mm的工业级精度要求。文章涵盖了标定基础原理、环境搭建、数据采集策略、核心算法实现及误差分析与优化,为视觉机械臂的自主抓取提供了实用指南。

weixin_31476015的博客 295

MQTT阿里云OTA 调试记录

2.验证,这个验证是什么意思呢,就是阿里云会把你包的信息,比如包大小,streamid(相当于包的识别码),版本号发送给你的设备,然后如果你没发送升级成功的包给阿里云,这里会是一直验证中的状态,那你的设备每次重新连接阿里云,发送connect包给阿里云的时候,阿里云就会发送一次这个验证(upgrade)包。提取到了之后就可以发送请求包了,这个请求包比较坑,也可能是我没付费,他的包一次最多只有1024个字节的数据。之前说了,验证状态下,设备发送connect包给阿里云,阿里云就会发一个upgrade包给你。

qq_42585211的博客 1231

重新认识enum(按照Object类的理解方式去理解enum)

按照Object类的理解方式去理解enum 重要的是看代码注释 !!!!! 链接大佬地址---》enum详解 /** * 测试枚举类 */ //我的理解相当于一个抽象类 public enum WeekDay { //默认实现抽象类中定义好的方法 实例 SUN(0), MON(1), TUS(2), WED(3), THU(4), FRI(5), SAT(6);...

one_dayR的博客 697

500道C++面试高频题解析(附答案、实战示例与进阶追问)

本文提供500道C++面试高频题的详细解析,涵盖基础概念到进阶应用,包括面向对象编程、内存管理、现代C++特性、并发编程等核心考点。每道题配有实战示例和进阶追问,帮助开发者突破八股文局限,掌握解决实际问题的能力,适合准备C++技术面试的工程师系统复习。

weixin_29002595的博客 310

Java 枚举类型

Java5 中添加的新特性,方便我们处理枚举类型集。 枚举类型的使用 1.枚举类型的定义 public enum ColorEnum { RED, YELLOW, GREEN, ; private ColorEnum() { } } 重点说明: 使用 enum关键字定义枚举类。 java 要求必须先定义 enum 实例,如果在定义...

qq_25259639的博客 161

【雕爷学编程】MicroPython手册之 Teensy 4.1 实时时钟 (RTC)

在类的初始化函数中,定义了用于控制I2C总线的i2c对象和RTC模块的I2C地址。接着,使用该引脚初始化了一个Pin对象。它还提供了8个串口,3个SPI端口,3个I2C端口,2个I2S/TDM数字音频端口,3个CAN总线(其中一个支持CAN FD),以及一个SDIO(4位数据)原生SD卡端口12。2、内存:Teensy 4.1配备了1024 KB的RAM(其中512 KB是紧密耦合的),8 MB的Flash(其中64 KB用于恢复和EEPROM模拟),以及两个位置可以选择添加更多的QSPI内存芯片。

雕爷学编程 575

【AFAC2026金融智能-赛题二】2亿像素的面条图,我切了1000刀拼回完美Markdown

摘要: AFAC2026金融智能创新大赛的「复杂金融文档还原挑战」任务是将高分辨率金融文档截图转换为结构化Markdown文本。面对2亿像素的“面条图”和严格的计算限制(禁用主流大模型,仅允许调用FinixDoc-VL API且模型需小于10M),作者提出四层流水线解决方案: 图像预处理:通过文本行投影检测在行间隙处智能切图,避免截断文字; API调度:5路并发轮询请求,结合内容哈希缓存与指数退避重试机制优化调用效率; 后处理:采用最长公共子串匹配去除文本重叠,并设计表格对齐算法修复跨块表格; 结果输出:按

169

原来枚举是可以相互比较的~~~~~~~~~~

用了这么久的枚举,居然才发现枚举是可以比较的。今天就好好的重新认识下枚举这个类。 package java.lang; import java.io.Serializable; import java.io.IOException; import java.io.InvalidObjectException; import java.io.ObjectInputStream; import java.io.ObjectStreamException; /** * This is the common

小小的人儿的博客 558

量化交易python代码解析:从狙击手算法到最优限价算法

在金融市场的竞技场上,量化交易如同一位冷静的策略大师,它以数学模型为剑,以计算机程序为盾,精准出击,捕捉市场的微妙波动。本文将深入探讨五种核心量化交易算法:直接委托算法(DMA)、时间加权平均算法(TWAP)、冰山算法(Iceberg)、狙击手算法(Sniper)、条件委托算法(Stop)以及最优限价算法(BestLimit),揭开它们背后的运作机制与实战应用。

木头大左的博客 1884

Java 面向对象进阶(static/final/枚举)

Java中static关键字/final关键字/枚举的使用方法详解

2502_93161594的博客 414

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

调用枚举接口重写方法提示找不到符号_后端接口编写的优雅

在分布式、微服务盛行的今天,绝大部分项目都采用的微服务框架,前后端分离方式。题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟;以前后端人员瞧不起前端人员,那现在后端人员要重新认识一下前端,前端已经很成体系了。一般系统的大致整体架构图如下:需要说明的是,有些小伙伴会回复说,这个架构太简单了吧,太low了,什么网关啊,缓存啊,消息中间件啊,都没有。...

weixin_39931923的博客 232

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

fourcc

FourCC全称Four-Character Codes,代表四字符代码 (four character code), 它是一个32位的标示符,其实就是typedef unsigned int FOURCC;是一种独立标示视频数据流格式的四字符代码。视频播放软件通过查询 Four

徐新华的专栏 699

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

《Effective C++》读书笔记(一):让自己习惯C++(条款01~04)

读《Effective C++》第一章:让自己习惯C++ 而写的总结笔记,从条款01到条款04.

wjmhlh的博客 504

template的妙用

template的妙用 游戏引擎开发网 龚敏敏本文发表于《开发高手》2004年第2期 如有转载请声明出处也许在很多C++程序员的心目中,template只是一个用于泛型的关键字而已。其实,它的作用远不止此。下面就让我们看看它的不可思议。 FOURCC的生成 FOURCC全称Four-Character Codes,是在编程中非常常用的东西,一般用作标示符。比如wav、avi等R

边缘程序员的专栏 2050

Spring Boot Jackson实战:从配置、注解到性能优化与安全防护

JSON序列化与反序列化是现代Web应用数据交换的核心技术,它负责将内存中的对象转换为可传输或存储的文本格式,反之亦然。其原理基于反射和类型映射,通过解析JSON结构并与Java对象属性进行匹配来实现数据转换。这项技术的价值在于实现了跨语言、跨平台的数据互通,是RESTful API、微服务通信和数据持久化的基础。在实际应用场景中,开发者常面临字段命名映射、日期格式处理、循环引用和空值控制等问题。本文聚焦于Spring Boot默认集成的Jackson库,深入探讨如何通过配置ObjectMapper、使用常

cuemes08808的博客 464
上一篇: @Lazy
下一篇: java Function介绍
han_hanker
博客等级 码龄13年 35粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值