让你的系统更安全--用枚举enum替代int常量

条款10:优先选用限定作用域enum,而非不限定作用域enum 限定作用域enum的枚举值不会污染外围命名空间,减少与其他标识符冲突的风险。非限定作用域enum的枚举值可能与其他变量或枚举值重名,导致编译错误或逻辑混淆。在需要与C代码交互或必须隐式转换为整数的旧代码中,可能需保留非限定作用域enum。限定作用域enum支持前置声明(forward declaration),编译器可直接确定其底层类型(默认为。显式转换,避免意外的类型转换错误。非限定作用域enum会隐式转换为整数,可能引发未预期的行为。非限定作用域enum需看到定义才能确定底层类型,不利于模块化设计。 阅读详情

做应用系统时,我们往往假设用户是小白,那么为了保证系统的正常,我们往往会对用户的参数做限制,并且前后端都要对用户的参数做验证。那我们在设计的时候是否可以提前预防这种问题呢?其中的一种方式就是:用枚举enum替代int常量。

13894260-e3bc2483a3a5cdbe.jpg

枚举的好处:

做应用系统时,我们往往假设用户是小白,那么为了保证系统的正常,我们往往会对用户的参数做限制,并且前后端都要对用户的参数做验证。那我们在设计的时候是否可以提前预防这种问题呢?其中的一种方式就是:用枚举enum替代int常量。

枚举的好处:

1. 类型安全性

2.使用方便性

示例1

<pre spellcheck="false" style="box-sizing: border-box; margin: 5px 0px; padding: 5px 10px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; font-size: 16px; line-height: inherit; font-family: inherit; vertical-align: baseline; cursor: text; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; background-color: rgb(240, 240, 240); border-radius: 3px; white-space: pre-wrap; color: rgb(34, 34, 34); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">public class EnumDemo {     
    enum Color{     
        RED(3),BLUE(5),BLACK(8),YELLOW(13),GREEN(28);          
        private int colorValue;     
        private Color(int rv){     
         this.colorValue=rv;       
        }   
        private int getColorValue(){
            return colorValue;
        }   

        private int value(){
            return ordinal()+1;
        }
}          
    public static void main(String[] args) { 
        for(Color s : Color.values()) {     
            //enum的values()返回一个数组,这里就是Seasons[]     
            System.out.println(s.value()+":"+s.name()+"="+s.getColorValue());     
        }     
    }     
} 
</pre>

output:

1:RED=3

2:BLUE=5

3:BLACK=8

4:YELLOW=13

5:GREEN=28

其中

<pre spellcheck="false" style="box-sizing: border-box; margin: 5px 0px; padding: 5px 10px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; font-size: 16px; line-height: inherit; font-family: inherit; vertical-align: baseline; cursor: text; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; background-color: rgb(240, 240, 240); border-radius: 3px; white-space: pre-wrap; color: rgb(34, 34, 34); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">    /**
     * Returns the ordinal of this enumeration constant (its position
     * in its enum declaration, where the initial constant is assigned
     * an ordinal of zero).
     *
     * Most programmers will have no use for this method.  It is
     * designed for use by sophisticated enum-based data structures, such
     * as {@link java.util.EnumSet} and {@link java.util.EnumMap}.
     *
     * @return the ordinal of this enumeration constant
     */
    public final int ordinal() {
        return ordinal;
    }
</pre>

示例2:

EnumMap是专门为枚举类型量身定做的Map实现。虽然使用其它的Map实现(如HashMap)也能完成枚举类型实例到值得映射,但是使用EnumMap会更加高效:它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以EnumMap使用数组来存放与枚举类型对应的值。这使得EnumMap的效率非常高。

<pre spellcheck="false" style="box-sizing: border-box; margin: 5px 0px; padding: 5px 10px; border: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; font-size: 16px; line-height: inherit; font-family: inherit; vertical-align: baseline; cursor: text; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; background-color: rgb(240, 240, 240); border-radius: 3px; white-space: pre-wrap; color: rgb(34, 34, 34); letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">import java.util.*;
public enum Phase {
    SOLID, LIQUID, GAS;
    public enum Transition {
        MELT(SOLID, LIQUID), FREEZE(LIQUID, SOLID), BOIL(LIQUID, GAS), CONDENSE(
                GAS, LIQUID), SUBLIME(SOLID, GAS), DEPOSIT(GAS, SOLID);
        private final Phase src;
        private final Phase dst;
        Transition(Phase src, Phase dst) {
            this.src = src;
            this.dst = dst;
        }
        private static final Map<Phase, Map<Phase, Transition>> m = new EnumMap<Phase, Map<Phase, Transition>>(
                Phase.class);
        static {
            for (Phase p : Phase.values())
                m.put(p, new EnumMap<Phase, Transition>(Phase.class));
            for (Transition trans : Transition.values())
                m.get(trans.src).put(trans.dst, trans);
        }
        public static Transition from(Phase src, Phase dst) {
            return m.get(src).get(dst);
        }
    }
    public static void main(String[] args) {
        for (Phase src : Phase.values())
            for (Phase dst : Phase.values())
                if (src != dst)
                    System.out.printf("%s to %s : %s %n", src, dst,
                            Transition.from(src, dst));
    }
}
</pre>
在 ABAP 里落地枚举的四种 Pattern:从 Native ENUM 到 BOPF 常量接口,怎么选才不踩坑 本文探讨了ABAP项目中离散值治理的最佳实践。文章指出,状态、类型等离散值看似简单,实则是业务语义的核心载体,不当处理会导致可读性差、维护困难和安全风险。作者分析了ABAP原生枚举的优势,并针对无法使用原生枚举的场景,系统介绍了四种替代模式:常量类模式(务实易用)、对象模式(类型安全)、接口模式(存在缺陷)和集合模式(易失控)。重点推荐常量类和对象模式,前者适合与DDIC Domain对齐的场景,后者通过对象实例实现真正的类型安全。文章结合SAP Gateway、RAP等实际框架,提供了具体实现示例和工程化 阅读详情

相关推荐

对极几何 —两相机相对位置关系与相机姿态估计方法(基础矩阵,本征矩阵,单应矩阵梳理)附c++源码

对极几何 —两相机相对位置关系与相机姿态估计方法(基础矩阵,本质矩阵,单应矩阵梳理)附c++源码对极几何是什么,它有什么用(整体流程理解)对极约束(描述两相机关系)基础矩阵特性与求解方法本质矩阵特性与求解方法相机姿态恢复方法怎么又冒出了个单应矩阵H? 对极几何是什么,它有什么用(整体流程理解) 如图,当空间上有一个点分别在相机1和相机2上进行成像,这两个点存在什么变换关系呢?再扩展一下,真实世界下的场景分别用两个相机进行拍摄,获得两张照片,两张照片有什么变换关系呢?那么对极几何就是用来描述这种变换关系的。

qq_37764141的博客 5104

高效Java技巧之尽可能使用枚举代替常量

有些类型的数据是可枚举的,比如一年的春夏秋冬四季、一年的十二个月、一周的七天,以及应用中其它可枚举的数据。有些代码中习惯使用常量来表示这些可枚举的数据,分为以下两种: int常量 String常量 public static final int APPLE_FUJI =0; public static final int APPLE_PIPPIN =1; public static final int APPLE_GRANNY_SMITH = 2; public static f

谈谈IT 947

从原理到实践:MIPI D-PHY v1.2的HS-Deskew功能全解析(附时序图详解)

本文深入解析MIPI D-PHY v1.2的HS-Deskew功能,从技术背景到实现机制,详细介绍了其在2.5Gbps高速传输中的关键作用。通过时序图详解和实测数据,帮助工程师理解并应用这一技术,解决信号完整性问题,提升系统可靠性。

weixin_30300225的博客 309

编写高质量代码改善C#程序的157个建议——建议110:用类来代替enum

建议110:用类来代替enum 枚举(enum)用来表示一组固定的值。例如,为了表示星期信息,我们可以定义枚举Week: enum Week { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, ...

weixin_30826761的博客 194

16、Arduino MEGA 2560 固件与电路详解

本文详细介绍了Arduino MEGA 2560的固件编程与电路设计,涵盖ATmega16U2和ATmega2560的熔丝配置、stk500v2引导加载程序的备份与恢复方法、使用Microchip Studio通过ICSP烧录固件的步骤,以及debugWIRE和JTAG调试接口的选择与配置。同时提供了电路块图解析、组件位置参考及常见问题解决方案,帮助用户深入理解硬件结构并进行高效开发与调试。

swift5iosmith的博客 195

10|Git Diff 与增量代码识别:本次到底改了哪些代码?

本文介绍 Git Diff 和增量代码识别,帮助你理解精准测试如何先找到本次真正变化的代码。测试开发工程师。Java 后端开发工程师。质量平台 / DevOps 平台建设者。想了解精准测试落地方法的技术负责人。

专注 AI 精准测试平台实战落地,分享从代码 Diff 到回归决策的完整工程闭环。主张“先建数据链路,再上 AI 智能”,让测试从“靠经验”走向“基于风险”。 162

C语言常量定义的差异:宏定义、const 与 enum 的全面对比

在正式对比之前,我们先快速回顾一下这三种定义方式的基本语法。100#define PI3.14159宏定义是预处理指令,在编译之前由预处理器进行文本替换。它不占用任何存储空间,也没有类型信息。// 条件编译// 条件编译 # ifdef DEBUG # define LOG(msg) printf("[DEBUG] %s\n" , msg) # else # define LOG(msg) # endif // 简单的常量替换 # define BUFFER_SIZE 1024。

2601_96757044的博客 367

分布式协作方案:OpenClaw多节点部署与设备互联

主从架构或对等架构服务发现与注册机制负载均衡策略选择分布式任务队列优先级调度失败重试机制WebSocket实时通信数据同步引擎冲突解决策略健康检查机制故障自动转移数据复制与恢复通过分布式部署,OpenClaw可以支撑更大规模的业务场景,提供更稳定可靠的AI助手服务。在下一篇文章中,我们将深入探讨安全与权限管理的精细化策略。

gaoxiang_120的专栏 371

Java Enum枚举替代方案--Android IntDef/StringDef Annotation注解

Java Enum枚举替代方案--Android IntDef/StringDef Annotation注解

superxlcr的博客 3973

如何利用air780e与stm32c8c6进行通信实现给手机发送一条英文短信的功能?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1238

CONN工具箱分析fmri数据笔记1

前言一、安装二、预处理三、去噪 前言 CONN:functional connectivity toolbox,是基于MATLAB和SPM的一个对功能磁共振数据进行分析的一个工具箱。可以进行以下分析: Seed-based correlations (SBC), ROI-to-ROI correlations, graph analyses, Independent component analyses(group-ICA), Masked (ICA) Amplitude of Low-Frequency.

weixin_52073820的博客 6587

java用枚举代替int常量,让你的系统更安全--用枚举enum替代int常量

做应用系统时,我们往往假设用户是小白,那么为了保证系统的正常,我们往往会对用户的参数做限制,并且前后端都要对用户的参数做验证。那我们在设计的时候是否可以提前预防这种问题呢?其中的一种方式就是:用枚举enum替代int常量。枚举的好处:做应用系统时,我们往往假设用户是小白,那么为了保证系统的正常,我们往往会对用户的参数做限制,并且前后端都要对用户的参数做验证。那我们在设计的时候是否可以提前预防这种问...

weixin_35403151的博客 936

第六节 LLaVA模型数据处理源码解读(input_ids/labels/attention_mask/image,上篇)

本篇文章直接介绍llava模型数据加工部分,整体结构说明llava多模态模型输入数据格式,其中包含input_ids/labels/attention_mask与image格式,并给出对应代码位置与整个数据加工流程。最重要,通过debug给出数据解释与代码解读,也通过一个真实数据给出模型输入格式说明。当你阅读完此篇文章,绝对透彻理解llava数据加工过程与内容。显然,一篇博客是无法呈现整个数据细节,我将继续下篇博客呈现数据细节处理。result = input.ne(3) # torch.ne函数调用。

weixin_38252409的博客 3196

让你的系统更安全——用枚举enum替代int常量

做应用系统时,我们往往假设用户是小白,那么为了保证系统的正常,我们往往会对用户的参数做限制,并且前后端都要对用户的参数做验证。那我们在设计的时候是否可以提前预防这种问题呢?其中的一种方式就是:用枚举enum替代int常量。枚举的好处:做应用系统时,我们往往假设用户是小白,那么为了保证系统的正常,我们往往会对用户的参数做限制,并且前后端都要对用户的参数做验证。那我们在设计的时候是否可以提前预防这种问...

weixin_34367257的博客 278

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Effective Java:用enum代替int常量

待完善… 1 简单概述 1.1 int枚举模式 public class Contant { public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; } 1.2 Stri...

添仔哥哥 560

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

第34项:用enum代替int常量

  枚举类型(enum type)是指由一组固定的常量组成合法值的类型,例如一年中的季节、太阳系中的行星或者一副扑克牌中的花色。在编程语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具名的int常量,没个类型成员一个常量: // The int enum pattern - severely deficient! public static final int APP...

Coloured_Glaze的博客 548

ssm框架搭建

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

Java:Effective java学习笔记之 用enum代替int常量

Java 用enum代替int常量用enum代替int常量1、用enum构建2、enum枚举常量与数据关联3、枚举常量与行为关联4、枚举策略模式5、总结参考 用enum代替int常量 在枚举类型出现之前,一般都常常使用int常量或者String常量表示列举相关事物。如: public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_S

JMW1407的博客 740

跟我学(Effective Java 2)第30条:用枚举(Enum)来代替int常量

第30条:用枚举(Enum)来代替int常量 枚举类型(enum type)是指由一组固定的常量组成合法值的类型 ,例如一年中的季节、太阳系中的行星或者一副牌中的花色。 在编程语言还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具名的 int 常量,每个类型成员一个常量: public static final int APPLE_FUJI = 0; public static final...

Dullon_jiang的博客 399

Kotlin - 枚举类 enum

声明枚举类使用 enum 关键字。每个枚举常量都是一个对象,用逗号分隔。格式: enum class 类名{ 常量名,常量名,常量名... } 默认属性 oridinal 该枚举常量的顺序,从0开始 name 该枚举常量的名字 默认函数 values( ) 获取所有枚举常量 valueof( ) 获取对应枚举常量 enum class Demo { RED, BLUE, YELLOW, GREEN } println...

HugMua的博客 2561

Effective Java笔记第五章枚举和注解第一节用enum代替int常量

Effective Java笔记第五章枚举和注解 第一节用enum代替int常量 1.枚举类型是指由一组固定的常量组成合法值的类型,例如:一年中的季节,太阳系中的行星或者一副牌中的花色。在编程语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具名的int常量,每个类型成员一个常量: public class Demo { public static final int APPLE_FUJI=0; public static final int APPLE_PIPPIN=1;

zh123456_789的博客 424

(30):用enum代替int常量

我们常常会需要int全局常量 如下: public static final int APP_START=1; public static final int APP_PAUSE=0; public static final int APP_STOP =2; public static final int PLAY_START=1; public static final int P

ahui2333的博客 783

如何安全实现C语言enum到int的转换?这4条规则必须牢记

掌握C语言枚举类型(enum)强制转换的关键方法,避免数据错误。本文详解4条安全转换规则,涵盖适用场景与核心技巧,提升代码稳定性。如何实现enum到int的安全转换?这4条规则值得收藏

VarIsle的博客 695

浅谈如何创建枚举常量

在C++的enum工具中提供了一种创建const的常量的方法,使用enum的句法和使用结构相似。例如请看下面语句: enum spectrum {red,orange,yellow,green,blue,violet,indigo,ultraviolet} ; 上面这段语句主要完成两种功能: 让spectrum成为新的枚举名,同样可以使用spetcrum当做类型名去声明枚举变量。其实spectrum就像struct变量被称为结构名一样。 red,orange,yellow,green,blue,v

qq_42138448的博客 639

Java枚举详解

枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在曰常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。 在 JDK 1.5 之前没有枚举类型,那时候一般用接口常量来替代。而使用 Java 枚举类型 enum 可以更贴近地表示这种常量。声明枚举 声明枚举时必须使用 enum 关键字,然后定义枚举的名称、可访问性、基础类型和成员等。枚举声明的语法如下: enum-modifier

Java后端技术栈 9079

c语言枚举变量就是int,c语言enum使用_enum枚举变量

该楼层疑似违规已被系统折叠隐藏此楼查看此楼二、enum枚举1. 枚举的定义枚举类型定义的一般形式为:enum 枚举名{ 枚举值表 };在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。例如:该枚举名为weekday,枚举值共有7个,即一周中的七天。凡被说明为weekday类型变量的取值只能是七天中的某一天。2. 枚举变量的说明如同结构和联合一样,枚举变量也可用不同的方式说明,即先定义后说明,...

weixin_29198045的博客 1438

C语言枚举(enum)超全详解:从入门到精通,一篇吃透!

本文全面介绍了C语言中枚举(enum)的定义、使用及注意事项。枚举是一种将固定含义的整型常量打包成类型的机制,可提高代码可读性、避免魔法数字、便于维护。文章详细讲解了枚举的定义语法、赋值规则、本质原理(本质是int类型)、内存大小(4字节),并与#define进行了对比区分。同时列举了枚举在状态机、错误码、菜单选项等场景的实际应用,指出了枚举变量可赋任意int值、不能直接打印名字等常见坑点。最后总结了枚举的特点及适用场景,并列出高频面试问题。全文系统性地介绍了枚举的方方面面,适合C语言初学者和面试准备者学习

2602_95178652的博客 3182
上一篇: 高并发、高可用、微服务架构选型Dubbo与Spring Cloud【纯干货,必收藏】!
下一篇: Java进阶架构师之如何画好架构图?阿里大神手把手教你!
普通网友
博客等级 码龄8年 342粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值