天道酬勤,学无止境

Java 使用枚举定义常量

前言

JDK1.5之后出现了枚举类型,最近在公司的项目中一直出现了枚举,发现枚举真香。对于项目比较庞大的,使用枚举不仅可以增加代码的可读性,也就是大佬们说的“优雅”,还有利于后期代码的维护。枚举比较常用的场景就是用于常量的定义,但是相比于使用“static final”,枚举类型会增加内存的消耗,这个就是枚举的缺点,但是对于目前的硬件来说,这点还是可以忽略的。

使用枚举定义常量

package com.chen.mykinthtest.test;

public enum Color {

    RED("红色", 1),
    GREEN("绿色", 2),
    BLUE("蓝色", 3);

    private String code;
    private int index;

    private Color(String code, int index) {
        this.code = code;
        this.index = index;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }
}
package com.chen.mykinthtest.test;

public class ColorTest {

    public static void main(String[] args) {
        String code = Color.RED.getCode();
        for(Color c:Color.values()){
            System.out.println("code"+c.getCode()+"  index:"+c.getIndex());
        }

    }
}

 

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 你真的了解java的枚举吗?(enum)
    你真的了解java的枚举吗?.1可以定义常量.2可以定义成员变量.3可以含有构造方法一.什么是枚举?二.为什么要使用枚举?最近在跟着做springboot的项目时,发现视频中用到了枚举的技术,当时一顿感叹,纳尼?!!枚举还能这么用!!!//定义枚举public enum ResultEnum {UNKONW_ERROR(-1, "未知错误"),SUCCESS(0, "成功"),PRIMARY_SCHOOL(100, "我猜你可能还在上小学"),MIDDLE_SCHOOL(101, "你可能在上初中"),;private Integer code;private String msg;ResultEnum(Integer code, String msg) {this.code = code;this.msg = msg;}public Integer getCode() {return code;}public String getMsg() {return msg;}}//使用枚举public class GirlException extends RuntimeException{private Integer code;public GirlException(ResultEnum resultEnum) {super(resultEnum.getMsg());this
  • 用Java实现常量的最佳方法是什么? [关闭](What is the best way to implement constants in Java? [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 3年前关闭。 已锁定。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 我看过这样的例子: public class MaxSeconds { public static final int MAX_SECONDS = 25; } 并假设我可以有一个Constants类来包装常量,并声明它们为static final。 我几乎不了解Java,并且想知道这是否是创建常量的最佳方法。 回答1 这是完全可以接受的,甚至可能是标准。 (public/private) static final TYPE NAME = VALUE; 其中TYPE是类型, NAME是所有大写字母的名称,下划线带有下划线,而VALUE是常量值; 我强烈建议不要将常量放在自己的类或接口中。 附带说明:声明为final且可变的变量仍然可以更改; 但是,变量永远不能指向其他对象。 例如: public static final Point ORIGIN = new Point(0,0); public static void main(String[] args){ ORIGIN.x = 3; } 那是合法的,因此ORIGIN将是( ORIGIN一个点。 回答2 我强烈建议不要使用单个常量类。 当时这似乎是个好主意
  • Java5 枚举类型使用总结
    Java5 枚举类型使用总结 一、概述 枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示。Tiger 专家、developerWorks 的多产作者 Brett McLaughlin 将解释枚举的定义,介绍如何在应用程序中运用枚举,以及它为什么能够让您抛弃所有旧的 public static final 代码。 枚举在什么地方适用呢?一条普遍规则是,任何使用常量的地方,例如目前用 switch 代码切换常量的地方。如果只有单独一个值(例如,鞋的最大尺寸,或者笼子中能装猴子的最大数目),则还是把这个任务留给常量吧。但是,如果定义了一组值,而这些值中的任何一个都可以用于特定的数据类型,那么将枚举用在这个地方最适合不过。 二、在枚举类型之前,Java是如何实现枚举功能的 在枚举类型出现之前,java是通过在接口或者类中定义public static final 的变量来实现的。比如,对于经典的红色警戒2中的英国狙击(sharp-shooter)手三个动作的描述: /** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2007-11-29 * Time: 8:53:04 * 狙击手活动 */ public interface SharpShooter
  • Java的枚举、注解和反射
    Java的枚举、注解和反射 一.枚举 1.介绍和格式 JDK1.5引入了新的类型——枚举。 在JDK1.5 之前,我们定义常量都是: public static fianl… 。很难管理。 1.枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 2.Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。 3.Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 “,”来分割。 4.在枚举类型中定义的常量是该枚举类型的实例。 定义格式: 权限修饰符 enum 枚举名称 { 实例1,实例2,实例3,实例4; } 2.常见方法 Enum是所有Java语言枚举类型的公共基本类(注意Enum是抽象类) 变量和类型方法描述protected Objectclone()抛出CloneNotSupportedException。intcompareTo(E o)将此枚举与指定的订单对象进行比较。booleanequals(Object other)如果指定的对象等于此枚举常量,则返回true。protected voidfinalize()枚举类不能有finalize方法。类getDeclaringClass()返回与此枚举常量的枚举类型对应的Class对象。inthashCode(
  • 拉勾就业急训营
    前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820…种一棵树最好的时间是十年前,其次是现在 我知道很多人不玩qq了,但是怀旧一下,欢迎加入六脉神剑Java菜鸟学习群,群聊号码:549684836 鼓励大家在技术的路上写博客 絮叨 昨天刚好有遇到一个枚举的小问题,然后发现自己并不是那么熟悉它,然后在开发中,枚举用的特别多,所以有了今天的文章。 什么是枚举 Java中的枚举是一种类型,顾名思义:就是一个一个列举出来。所以它一般都是表示一个有限的集合类型,它是一种类型,在维基百科中给出的定义是: 在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠.。枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的SUNDAY、MONDAY、TUESDAY、WEDNESDAY、THURSDAY、FRIDAY、SATURDAY就是一个枚举。 出现的原因 在Java5之前,其实是没有enum的,所以先来看一下Java5之前对于枚举的使用场景该怎么解决?这里我看到了一片关于在Java 1.4之前的枚举的设计方案: public class Season { public static final int SPRING = 1; public static
  • 了解Java中的枚举(Understanding Enums in Java)
    问题 什么是Java枚举? 它们如何工作? 我在哪里可以使用它们?如何使用? 我可以在应用程序中不使用枚举吗?还是它们如此强大,以至于比忽略它们更好? 回答1 Java 5+中的枚举基本上是具有一组预定义实例的类。 它们旨在代替例如整数常量的集合。 它们最好是常量,因为它们可以增强类型安全性。 因此,而不是: public class Suit { public final static int SPADES = 1; public final static int CLUBS = 2 public final static int HEARTS = 3; public final static int DIAMONDS = 4; } 你有: public enum Suit { SPADES, CLUBS, HEARTS, DIAMONDS } 优点是: 输入安全性。 您可以将函数参数,返回类型,类成员或局部变量声明为特定的Enum类型,然后编译器将强制执行类型安全性。 枚举基本上是类。 他们可以实现接口,具有行为等。 类型安全是一个问题,因为在第一个示例中,这些是有效的语句: int i = Suit.DIAMONDS * Suit.CLUBS; 或者您可以将11传递给需要西装的功能。 您不能使用类型安全的枚举来做到这一点。 您可以使用Suit类来提供类型安全,这是Java
  • 与具有公共静态final字段的类相比,Java枚举有什么优势?(What's the advantage of a Java enum versus a class with public static final fields?)
    问题 我对C#非常熟悉,但是开始在Java中工作更多。 我希望了解到Java中的枚举基本上与C#中的枚举等效,但显然并非如此。 最初,我很高兴得知Java枚举可以包含多条数据,这似乎非常有利(http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)。 但是,从那时起,我发现了很多C#缺少的功能,例如能够轻松地为enum元素分配特定值的功能,以及因此无需花费大量精力即可将整数转换为enum的功能(即将整数值转换为匹配的Java枚举)。 所以我的问题是:与具有一堆公共静态final字段的类相比,Java枚举对Java枚举有什么好处吗? 还是只是提供更紧凑的语法? 编辑:让我更清楚。 与具有一堆相同类型的公共static final字段的类相比,Java枚举有什么好处? 例如,在第一个链接的“行星”示例中,与具有这些公共常量的类相比,枚举的优势是什么: public static final Planet MERCURY = new Planet(3.303e+23, 2.4397e6); public static final Planet VENUS = new Planet(4.869e+24, 6.0518e6); public static final Planet EARTH = new Planet(5
  • 什么是枚举,为什么有用?(What are enums and why are they useful?)
    问题 今天,我浏览了该站点上的一些问题,发现提到了一个单例模式中使用的enum ,该enum声称这种解决方案具有线程安全性。 我从未使用过enum并且我使用Java编程已经有两年多了。 显然,他们改变了很多。 现在,他们甚至在自己内部对OOP进行了全面的支持。 现在为什么在日常编程中使用枚举?为什么?为什么? 回答1 当变量(尤其是方法参数)只能从一小部分可能的值中取出一个时,应始终使用枚举。 例如类型常量(合同状态:“永久”,“临时”,“学徒”)或标志(“立即执行”,“推迟执行”)。 如果使用枚举而不是整数(或字符串代码),则将增加编译时检查并避免错误传入无效常量,并记录哪些值是合法使用的。 顺便说一句,枚举的过度使用可能意味着您的方法做的太多(通常最好有几个单独的方法,而不是一个带有几个修改其功能的标志的方法),但是如果您必须使用标志或键入代码,则枚举是要走的路。 例如,哪个更好? /** Counts number of foobangs. * @param type Type of foobangs to count. Can be 1=green foobangs, * 2=wrinkled foobangs, 3=sweet foobangs, 0=all types. * @return number of foobangs of type */ public int
  • 自定义枚举也是可序列化的吗?(Is custom enum Serializable too?)
    问题 我了解Enum是可序列化的。 因此,这样做是安全的。 (selectedCountry是enum Country ) 没有客户成员变量的原始枚举 public enum Country { Australia, Austria, UnitedState; } 分段 @Override public void onActivityCreated (Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { selectedCountry = (Country)savedInstanceState.getSerializable(SELECTED_COUNTRY_KEY); } } @Override public void onSaveInstanceState(Bundle savedInstanceState) { savedInstanceState.putSerializable(SELECTED_COUNTRY_KEY, selectedCountry); } 但是,如果我在自定义枚举类中有不可序列化的成员,该怎么办? 例如, 原始枚举客户成员变量 package org.yccheok; import org
  • 用枚举实现Singleton(在Java中)(Implementing Singleton with an Enum (in Java))
    问题 我已经读过,可以使用Enum在Java中实现Singleton ,例如: public enum MySingleton { INSTANCE; } 但是,以上内容如何运作? 具体来说,必须实例化Object 。 在这里,如何实例化MySingleton ? 谁在做new MySingleton() ? 回答1 这个, public enum MySingleton { INSTANCE; } 有一个隐式的空构造函数。 相反,让它明确 public enum MySingleton { INSTANCE; private MySingleton() { System.out.println("Here"); } } 如果您随后使用main()方法添加了另一个类,例如 public static void main(String[] args) { System.out.println(MySingleton.INSTANCE); } 你会看到 Here INSTANCE enum字段是编译时间常数,但它们是其enum类型的实例。 并且,它们是在首次引用枚举类型时构造的。 回答2 enum类型是class一种特殊类型。 您的enum实际上将被编译为类似 public final class MySingleton { public final static
  • Java中的枚举。 优点?(Enum in Java. Advantages?)
    问题 使Java中的枚举类似于类而不是像C / C ++那样仅是常量集合有哪些优点? 回答1 您可以获得有效值的免费编译时检查。 使用 public static int OPTION_ONE = 0; public static int OPTION_TWO = 1; 不保证 void selectOption(int option) { ... } 将仅接受0或1作为参数值。 使用枚举是可以保证的。 此外,由于您可以使用代码完成功能来查看所有枚举值,因此这会导致更多的自我记录代码。 回答2 类型安全是原因之一。 我发现更重要的另一点是,您可以将元数据附加到Java中的枚举值中。 例如,您可以使用一个枚举来定义Web服务的合法操作集,然后为请求和数据类的类型附加元数据: AddItem(HttpMethod.POST, ProductEntry.class), 回答3 Java 5枚举源自Joshua Bloch的Effective Java(第一版)的类型安全枚举模式,以避免C / C ++ / C#中的枚举的陷阱(它们只是薄薄的int常量)以及在Java中使用最终静态int常数。 主要是int常量和int枚举不是类型安全的。 您可以传入任何int值。 在C / C ++中,您可以执行以下操作: enum A { one, two, three }; enum B { beef
  • java-枚举
    枚举简介 Java 枚举是一个特殊的类,一般表示一组常量.比如:一个星期的 7 天,一年的 4 个季节,方向有上下左右等等。 Java 枚举类关键字:enum 各个常量使用逗号 , 来分割. 枚举定义 例如定义枚举类: enum Color { RED, YELLOW, BLUE; } 枚举类 Color 颜色常量有 RED, YELLOW, BLUE,分别代表红,黄,蓝。 使用实例: enum Color { RED, YELLOW, BLUE; } public class Test { public static void main(String[] args) { Color c = Color.YELLOW; System.out.println(c); } } 执行以上代码输出: YELLOW 枚举类还可以声明在类中: public class Test { public static void main(String[] args) { Color c = Color.YELLOW; System.out.println(c); } enum Color { RED, YELLOW, BLUE; } } 执行以上代码输出: YELLOW 举获枚取元素 可以使用 for 语句来迭代枚举元素: public class Test{ enum Color { RED
  • kotlin : 注解(Annotation):枚举类(enum)与@IntDef @StringDef与静态常量
    Java / kotlin注解定义对比: //java 注解 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface Test {} //kotlin 注解 @Target(AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.FIELD, AnnotationTarget.FUNCTION) @kotlin.annotation.Retention(AnnotationRetention.SOURCE) annotation class Test Android中不使用枚举类(enum)替代为@IntDef @StringDef 使用注解代替枚举(enum) enum在java中的实质是特殊单例的静态成员变量。在运行期,所有枚举类作为单例,全部加载到内存中。 所以,枚举增加了运行时的内存占用。 @Target(AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.FIELD, AnnotationTarget.FUNCTION) @MustBeDocumented @IntDef(Sex.MAN, Sex.WOMEN) @kotlin.annotation.Retention
  • Java复习打卡day24
    Java复习打卡day24 枚举类型概述枚举定义枚举的常用方法枚举接口枚举注意事项注解概述内置注解自定义注解反射概述类加载器与资源目录 枚举类型概述 枚举简介 枚举类型是在JDK1.5之后引进的,在此之前定义一个常量都是:public static final...很难管理。 枚举可以将一些相关的常量放在一起管理,同时它还提供了比常量更多的方法。 枚举类型可以包含很多的常量,例如: 一年的四级: 春、夏、秋、冬; 问题的程度: 轻、重、缓、急 速度的等级: 高、中、低 在枚举类型中定义的常量是枚举类型的实例。 下面将通过具体的代码来向大家展示,常量(枚举类型)的定义和使用。 枚举定义 public class Demo { //枚举 private String LOW = "1" ; private String MEDIUM = "50"; private String HIGH = "100"; public Demo(String LOW, String MEDIUM, String HIGH) { this.LOW = LOW; this.MEDIUM = MEDIUM; this.HIGH = HIGH; } public String getLOW() { return LOW; } public String getMEDIUM() { return MEDIUM
  • java 总结(enum,设计模式....)
    创建一个子类时(继承关系),他们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造方法的调用顺序 ① 父类的静态代码块和静态属性(优先级一样,按定义顺序执行) ② 子类的静态代码块和静态属性(优先级一样,按定义顺序执行) ③ 父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行) ④ 父类的构造方法 ⑤ 子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行) ⑥ 子类的构造方法 代码: package com.atguigu.day15; public class CodeBlockExam { public static void main(String[] args) { //System.out.println(Person1.total);101 //System.out.println(Person1.total);101 C02 c02 = new C02(); } } class Person1 { public static int total = 100; static { total++; System.out.println("in static block"); } } class A02 { private static int n1 = getVal01(); static { System.out.println(
  • Java——枚举 & 注解 & 反射
    枚举 & 注解 & 反射 1、枚举 1.1、简介 JDK1.5引入了新的类型——枚举。 在JDK1.5 之前,我们定义常量都是: public static fianl… 。很难管理。 枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 用于定义有限数量的一组同类常量, 例如: 错误级别: 低、中、高、急 一年的四季: 春、夏、秋、冬 商品的类型: 美妆、手机、电脑、男装、女装… 在枚举类型中定义的常量是该枚举类型的实例. 1.2、定义格式 权限修饰符 enum 枚举名称 { 实例1,实例2,实例3,实例4; } 事例: public enum Level { LOW(30), MEDIUM(15), HIGH(7), URGENT(1); private int levelValue; private Level(int levelValue) { this.levelValue = levelValue } public int getLevelValue() { return levelValue; } } 1.3、枚举类的主要方法 1.4、实现接口的枚举类 所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。 每个枚举对象,都可以实现自己的抽象方法. public interface
  • 如何在Java枚举中定义静态常量?(How to define static constants in a Java enum?)
    问题 有什么方法可以在Java枚举声明中定义静态最终变量(有效常量)? 我想要在一个地方定义BAR(1 ... n)值的字符串文字值: @RequiredArgsConstructor public enum MyEnum { BAR1(BAR_VALUE), FOO("Foo"), BAR2(BAR_VALUE), ..., BARn(BAR_VALUE); private static final String BAR_VALUE = "Bar"; @Getter private final String value; } 对于以上代码,我收到以下错误消息:在定义字段之前无法引用它。 回答1 正如IntelliJ IDEA建议的那样,在提取常量时-制作静态嵌套类。 此方法有效: @RequiredArgsConstructor public enum MyEnum { BAR1(Constants.BAR_VALUE), FOO("Foo"), BAR2(Constants.BAR_VALUE), ..., BARn(Constants.BAR_VALUE); @Getter private final String value; private static class Constants { public static final String BAR_VALUE =
  • 比较Java枚举成员:==或equals()?(Comparing Java enum members: == or equals()?)
    问题 我知道Java枚举被编译为具有私有构造函数和一堆公共静态成员的类。 比较给定枚举的两个成员时,我总是使用.equals() ,例如 public useEnums(SomeEnum a) { if(a.equals(SomeEnum.SOME_ENUM_VALUE)) { ... } ... } 但是,我碰到了一些使用equals运算符==而不是.equals()的代码: public useEnums2(SomeEnum a) { if(a == SomeEnum.SOME_ENUM_VALUE) { ... } ... } 我应该使用哪个运算符? 回答1 两者在技术上都是正确的。 如果您查看.equals()的源代码,它只是.equals() == 。 我使用== ,但是这将是null安全的。 回答2 可以在enum上使用==吗? 是的:枚举具有严格的实例控件,使您可以使用==比较实例。 这是语言规范提供的保证(我强调): JLS 8.9枚举枚举类型除了由其枚举常量定义的实例外,没有其他实例。 尝试显式实例化枚举类型是编译时错误。 Enum的final clone方法可确保永远不会克隆enum常量,并且序列化机制的特殊处理可确保不会因反序列化而创建重复的实例。 禁止枚举类型的反射实例化。 总之,这四件事确保了enum类型的实例不存在超出enum常量定义的实例的情况。
  • Java - 枚举, 注解和反射 (详解)
    文章目录 枚举常用方法枚举类实现接口枚举注意事项 注解1. 内置注解2. 元注解3. 自定义注解注解架构ElementType(注解的用途类型)RetentionPolicy(注解作用域策略)定义格式类似于这样定义 ↓ 反射1.类加载器类加载器如何避免类加载重复的 ?得到Class的几种方式 2. 获取Constructor类似于这样用 ↓ 3. 获取Method类似于这样用 ↓ 4. 获取Field类似于这样用 ↓ 5. 获取注解信息 内省1. Introspector2. BeanInfo3. MethodDescriptor代码示例 (类似于这么用↓) 枚举 定义 => 枚举类型: 定义有限数量的一组同类常量 eg: 春夏秋冬 发展 => 从很多常量(public static final…) => 难管理 到enum类型 将同类常量分至一组管理 这就是枚举类型出现的原因 使用 => 最简单的枚举类: public enum demo(){ SPRING,SUMMER,FALL,WINTER; } (然后可以去构建构造方法, 并对其进行初始化操作) 其实 enum 就相当于是将 public static final 给简化了 常用方法 枚举类实现接口 直接看例子: public Demo implements Test{ SPRING{ @Overrride public
  • 如何在Java中从常量向枚举提供枚举值(How to supply Enum value to an annotation from a Constant in Java)
    问题 我无法使用从常量中获取的枚举作为注释中的参数。 我收到此编译错误:“注释属性[attribute]的值必须是一个枚举常量表达式”。 这是枚举代码的简化版本: public enum MyEnum { APPLE, ORANGE } 对于注释: @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.METHOD }) public @interface MyAnnotation { String theString(); int theInt(); MyEnum theEnum(); } 和班级: public class Sample { public static final String STRING_CONSTANT = "hello"; public static final int INT_CONSTANT = 1; public static final MyEnum MYENUM_CONSTANT = MyEnum.APPLE; @MyAnnotation(theEnum = MyEnum.APPLE, theInt = 1, theString = "hello") public void methodA() { } @MyAnnotation(theEnum = MYENUM_CONSTANT