魔功心法-枚举篇

2023-11-21 17:40
文章标签 枚举 心法 魔功

本文主要是介绍魔功心法-枚举篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是枚举

枚:量词。一般用于较小的片状物,相当于“个”。

举:提出:列举。举一反三。举个例子。

所以,枚举就是一个个列举出来

枚举的作用

魔功的作用,就不过多描述了,主打的就是一个优雅。

枚举的使用

枚举的成员方法

在学习枚举之前,我们很有必要了解他的几个比较重要的成员方法。我们先定义一个枚举如下:

public enum TestEnum {
}
  • 这里可以看到,枚举中有两个比较重要的方法,分别是 values() 和 valueOf();

方法名称具体含义使用方法
values()该方法可以将枚举类型成员以数组的形式返回枚举类型名称.values()
valueOf()该方法可以实现将普通字符串转换为枚举实例枚举类型名称.valueOf("ABC")
  • 下面我们随便在枚举中添加两个属性 boy 和 girl
// 规范写法
public enum TestEnum {BOY,GIRL
}// 属性大写只是一种规范,小写也是可以的
public enum TestEnum {Boy,Girl
}// 既然小写可以,那么乱写也是没有问题的
public enum TestEnum {BoY,giRL
}
  • 我们使用规范的方法,试试枚举中的 values() 方法,这个方法是拿到 TestEnum 中的所有属性,并且以数组的形式返回。


  • 试试枚举中的 values() 方法

从上面可以看到,这三者的返回值是一样的,类型都是 TestEnum。那这个方法就没啥好看的了,就是拿到 TestEnum 中的单个属性。

枚举与常量类的对比

枚举类

public enum TestEnum {BOY,GIRL
}

常量类

public class TestConstant {private static Integer BOY;private static Integer GIRL;
}
  • 枚举和常量类的对比一目了然。但是一般情况下,我们使用常量类都是下面这种形式。
public class TestConstant {// 男private static final Integer BOY = 0;// 女private static Integer GIRL = 1;
}
  • 这样看起来是不是更加亲切了,那么枚举类应该怎么写呢,效果如下
@Getter
public enum TestEnum {BOY(0),GIRL(1);private Integer code;TestEnum(Integer code){this.code = code;}}
  • 两者使用对比
public static void main(String[] args) {// 使用常量类Integer boy = TestConstant.BOY;Integer girl = TestConstant.GIRL;// 使用枚举Integer enumBoy = TestEnum.BOY.getCode();Integer girlCode = TestEnum.GIRL.getCode();
}
枚举与常量类的使用
  • 众所周知,我们对前端展示的 性别 这个属性,一般在数据表中都是存 0,1。这样的话,每次查询和入库都需要做转换。
@Data
public class People {private String gender;
}
  • 常量类转化
People people = new People();
// int 转为 String
Integer boy = TestConstant.BOY;
if (boy == 0) {people.setGender("男");
}
Integer girl = TestConstant.GIRL;
if (girl == 1) {people.setGender("女");
}
  • 枚举转化
People people = new People();
// 使用枚举
Integer enumBoy = TestEnum.BOY.getCode();
if (enumBoy == 0) {people.setGender("男");
}
Integer girlCode = TestEnum.GIRL.getCode();
if (girlCode == 1) {people.setGender("女");
}

毫无违和感,那还要枚举干啥勒。别着急,下面就介绍枚举的另一种用法 :

@Getter
public enum TestEnum {BOY(0,"男"),GIRL(1,"女");private Integer code;private String name;TestEnum(Integer code,String name){this.code = code;}
}
  • 枚举转化 2
People people = new People();
// 使用枚举
Integer enumBoy = TestEnum.BOY.getCode();
if (enumBoy == 0) {String name = TestEnum.BOY.getName();people.setGender(name);
}Integer girlCode = TestEnum.GIRL.getCode();
if (girlCode == 1) {String name = TestEnum.GIRL.getName();people.setGender(name);
}

真好,如果工资是按代码行数发的,那你就能多拿两打工资了

  • 枚举转化3

上面 2 的写法,基本上都是固定了,不符合面向对象的写法,我们应该抽象出来这一个方法,方法的入参是 int 类型,返回值是 String 类型。比如传入一个 0,返回一个男,传入一个 1,返回一个女。这个时候前面的这个 values() 方法就派上用场了

@Getter
public enum TestEnum {BOY(0,"男"),GIRL(1,"女");private Integer code;private String name;TestEnum(Integer code,String name){this.code = code;}// 这个是抽象的方法,放在枚举里面 public static String getName(int code) {// 遍历 TestEnum.values()for (TestEnum testEnum : TestEnum.values()) {// 如果枚举 code 和传入的 code相同,返回对应的文字if (testEnum.getCode() == code) {return testEnum.name;}}// 不匹配,返回默认值return null;} }
  • 使用方法改造
People people = new People();
// 使用枚举
Integer enumBoy = TestEnum.BOY.getCode();
if (enumBoy == 0) {people.setGender(TestEnum.getName(0));
}Integer girlCode = TestEnum.GIRL.getCode();
if (girlCode == 1) {people.setGender(TestEnum.getName(1));
}

是不是有高手那味了,这就是魔功枚举的强大之处,随随便便一个常量,就硬生生给你整成高手范。


枚举的进阶

  • 完了嘛?如果只是简单的使用,确实是完了,但是我们的追求远不止如此,我们用了枚举,就一定要用出高手风范:一切皆可枚举
三属性枚举

要获取每个网站的地址,要把每个网站的地址存储起来,网站地址都是已知的。并且不做维护。

  • 如果要建立一张表,大概如下:

  • 如果我们用枚举来实现,就是下面这样
@Getter
public enum InternetEnum {BAIDU(1,"百度","www.baidu.com"),HUOHU(2,"火狐","www.huohu.com"),GUGLE(3,"谷歌","www.guge.com"),SLO(4,"360","www.360.com"),QQ(5,"qq","www.qq.com");private Integer code;private String name;private String address;private InternetEnum(int code,String name,String address) {this.code = code;this.name = name;this.address = address;}private String getName(int code){for (InternetEnum internetEnum : InternetEnum.values()) {if (internetEnum.getCode()==code){return internetEnum.getName();}}return null;}private String getAddress(int code){for (InternetEnum internetEnum : InternetEnum.values()) {if (internetEnum.getCode()==code){return internetEnum.getAddress();}}return null;}
}

这里只是举个例子,前提是这些属性不经常变的,如果是经常变的,还是得考虑使用数据表。至于哪些是不变的,如果你维护过别人的代码,就一定能见过很多这样的东西,这时候大胆使用枚举改掉他。

N属性
  • 有了三属性,就有四属性,五属性,不知道,当你看到下面这种枚举的时候,你会不会陷入沉思,并且优雅亲切来上一句问候

枚举神奇之处

  • 枚举用顺手之后,万物皆可枚举 
  • 对前端:传 0,1 入参就行
  • 对数据表,咱就存 0,1 就行
  • 这样一来,主动权就在你手里了,当别人看着数据表一堆 0,1 陷入沉思的时候、当前端其他人来接手你的代码时,前端传给他一堆 0,1的时候,就是魔功显示威力的时候。

这篇关于魔功心法-枚举篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/2301_77550592/article/details/131868051
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/403977

相关文章

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

hdu 2489 (dfs枚举 + prim)

题意: 对于一棵顶点和边都有权值的树,使用下面的等式来计算Ratio 给定一个n 个顶点的完全图及它所有顶点和边的权值,找到一个该图含有m 个顶点的子图,并且让这个子图的Ratio 值在所有m 个顶点的树中最小。 解析: 因为数据量不大,先用dfs枚举搭配出m个子节点,算出点和,然后套个prim算出边和,每次比较大小即可。 dfs没有写好,A的老泪纵横。 错在把index在d

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m