精华内容
下载资源
问答
  • 枚举其实是个特殊的 Java 类,创建枚举需用enum关键字,...,这里的 E 表示枚举类型的名称,枚举类的每个值都会映射到protected Enum(String name, int ordinal)构造函数中,每个值(如NumEnum中的ONE)的名称都被...

    枚举其实是个特殊的 Java 类,创建枚举需用enum关键字,枚举类都是java.lang.Enum的子类,java.lang.Enum是一个抽象类,枚举类型符合通用类型模式Class Enum>,这里的 E 表示枚举类型的名称,枚举类的每个值都会映射到protected Enum(String name, int ordinal)构造函数中,每个值(如NumEnum中的ONE)的名称都被转成字符串, ordinal 表示被创建的顺序(默认是0,1,2,3...)。

    枚举类enum定义如下:

    enum NumEnum{

    ONE,TWO,THREE,FOUR

    }

    实际上是调用了如下方法:

    new Enum("ONE",0);

    new Enum("TWO",1);

    new Enum("THREE",2);

    new Enum("FOUR",3);

    常用方法如下:

    //比较此枚举与指定对象的顺序

    int compareTo(E o)

    //返回与此枚举常量的枚举类型相对应的 Class 对象

    Class getDeclaringClass()

    //返回此枚举常量的名称

    String name()

    //返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)

    int ordinal()

    // 返回枚举常量的名称

    String toString()

    //返回带指定名称的指定枚举类型的枚举常量

    static > T valueOf(Class enumType, String name)

    NumEnum调用常用方法如下:

    System.out.println(NumEnum.ONE.compareTo(NumEnum.FOUR));// -3

    System.out.println(NumEnum.ONE.getDeclaringClass());//class com.jeeno.test.NumEnum

    System.out.println(NumEnum.TWO.name());//TWO

    System.out.println(NumEnum.THREE.ordinal());//2

    System.out.println(NumEnum.THREE.toString());//THREE

    System.out.println(NumEnum.ONE.valueOf("FOUR"));//FOUR

    实际上enum就是一个class,只不过 Java 编译器帮我们做了语法的解析和编译而已。可以把enum看成是一个普通的class,它们都可以定义一些属性和方法,不同之处是:enum不能使用extends关键字继承其他类,因为enum已经继承了java.lang.Enum(java是单一继承)。

    展开全文
  • 原文网址:http://iaiai.iteye.com/blog/18435531 背景在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量。之前我们通常利用public final static 方法定义的代码如下,分别用1 表示...

    原文网址:http://iaiai.iteye.com/blog/1843553

    1   背景

    在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量。之前我们通常利用public final static 方法定义的代码如下,分别用1 表示春天,2表示夏天,3表示秋天,4表示冬天。

    Java代码  bd35dcfcdece18a2700be40e56db1078.png

    public class Season {

    public static final int SPRING = 1;

    public static final int SUMMER = 2;

    public static final int AUTUMN = 3;

    public static final int WINTER = 4;

    }

    这种方法称作int枚举模式。可这种模式有什么问题呢,我们都用了那么久了,应该没问题的。通常我们写出来的代码都会考虑它的安全性、易用性和可读性。

    首先我们来考虑一下它的类型安全性。当然这种模式不是类型安全的。比如说我们设计一个函数,要求传入春夏秋冬的某个值。但是使用int类型,我们无法保证传入的值为合法。代码如下所示:

    Java代码  bd35dcfcdece18a2700be40e56db1078.png

    public class Season {

    public static final int SPRING = 1;

    public static final int SUMMER = 2;

    public static final int AUTUMN = 3;

    public static final int WINTER = 4;

    private String getChineseSeason(int season){

    StringBuffer result = new StringBuffer();

    switch(season){

    case Season.SPRING :

    result.append("春天");

    break;

    case Season.SUMMER :

    result.append("夏天");

    break;

    case Season.AUTUMN :

    result.append("秋天");

    break;

    case Season.WINTER :

    result.append("冬天");

    break;

    default :

    result.append("地球没有的季节");

    break;

    }

    return result.toString();

    }

    public void doSomething(){

    System.out.println(this.getChineseSeason(Season.SPRING));//这是正常的场景

    System.out.println(this.getChineseSeason(5));//这个却是不正常的场景,这就导致了类型不安全问题

    }

    public static void main(String[] arg){

    Season season = new Season();

    season.doSomething();

    }

    }

    程序getChineseSeason(Season.SPRING)是我们预期的使用方法。可getChineseSeason(5)显然就不是了,而且编译很通过,在运行时会出现什么情况,我们就不得而知了。这显然就不符合Java程序的类型安全。

    接下来我们来考虑一下这种模式的可读性。使用枚举的大多数场合,我都需要方便得到枚举类型的字符串表达式。如果将int枚举常量打印出来,我们所见到的就是一组数字,这是没什么太大的用处。我们可能会想到使用String常量代替int常量。虽然它为这些常量提供了可打印的字符串,但是它会导致性能问题,因为它依赖于字符串的比较操作,所以这种模式也是我们不期望的。

    从类型安全性和程序可读性两方面考虑,int和String枚举模式的缺点就显露出来了。幸运的是,从Java1.5发行版本开始,就提出了另一种可以替代的解决方案,可以避免int和String枚举模式的缺点,并提供了许多额外的好处。那就是枚举类型(enum type)。接下来的章节将介绍枚举类型的定义、特征、应用场景和优缺点。

    2   定义

    枚举类型(enum type)是指由一组固定的常量组成合法的类型。Java中由关键字enum来定义一个枚举类型。下面就是java枚举类型的定义。

    Java代码  bd35dcfcdece18a2700be40e56db1078.png

    public enum Season {

    SPRING, SUMMER, AUTUMN, WINTER;

    }

    3   特点

    Java定义枚举类型的语句很简约。它有以下特点:

    1)  使用关键字enum

    2)  类型名称,比如这里的Season

    3)  一串允许的值,比如上面定义的春夏秋冬四季

    4)  枚举可以单独定义在一个文件中,也可以嵌在其它Java类中

    除了这样的基本要求外,用户还有一些其他选择

    5)  枚举可以实现一个或多个接口(Interface)

    6)  可以定义新的变量

    7)  可以定义新的方法

    8)  可以定义根据具体枚举值而相异的类

    4   应用场景

    以在背景中提到的类型安全为例,用枚举类型重写那段代码。代码如下:

    Java代码  bd35dcfcdece18a2700be40e56db1078.png

    public enum Season {

    SPRING(1), SUMMER(2), AUTUMN(3), WINTER(4);

    private int code;

    private Season(int code){

    this.code = code;

    }

    public int getCode(){

    return code;

    }

    }

    Java代码  bd35dcfcdece18a2700be40e56db1078.png

    public class UseSeason {

    /**

    * 将英文的季节转换成中文季节

    * @param season

    * @return

    */

    public String getChineseSeason(Season season){

    StringBuffer result = new StringBuffer();

    switch(season){

    case SPRING :

    result.append("[中文:春天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");

    break;

    case AUTUMN :

    result.append("[中文:秋天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");

    break;

    case SUMMER :

    result.append("[中文:夏天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");

    break;

    case WINTER :

    result.append("[中文:冬天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");

    break;

    default :

    result.append("地球没有的季节 " + season.name());

    break;

    }

    return result.toString();

    }

    public void doSomething(){

    for(Season s : Season.values()){

    System.out.println(getChineseSeason(s));//这是正常的场景

    }

    //System.out.println(getChineseSeason(5));

    //此处已经是编译不通过了,这就保证了类型安全

    }

    public static void main(String[] arg){

    UseSeason useSeason = new UseSeason();

    useSeason.doSomething();

    }

    }

    引用

    [中文:春天,枚举常量:SPRING,数据:1]

    [中文:夏天,枚举常量:SUMMER,数据:2]

    [中文:秋天,枚举常量:AUTUMN,数据:3]

    [中文:冬天,枚举常量:WINTER,数据:4]

    这里有一个问题,为什么我要将域添加到枚举类型中呢?目的是想将数据与它的常量关联起来。如1代表春天,2代表夏天。

    5   总结

    那么什么时候应该使用枚举呢?每当需要一组固定的常量的时候,如一周的天数、一年四季等。或者是在我们编译前就知道其包含的所有值的集合。优点是:枚举能满足绝大部分程序员的要求的,它的简明,易用的特点是很突出的。缺点:与int常量相比,枚举有个小小的性能缺点,即装载和初始化枚举时会有空间和时间的成本。如受资源约束的设备:手机等。

    展开全文
  • Java Enum和String及int的相互转化发布时间:2018-04-18 21:47,浏览次数:742, 标签:JavaEnumStringint一、定义性别枚举枚举(enum),是指一个经过排序的、被打包成一个单一实体的项列表。使用枚举增加程序可读性、...

    Java Enum和String及int的相互转化

    发布时间:2018-04-18 21:47,

    浏览次数:742

    , 标签:

    Java

    Enum

    String

    int

    一、定义性别枚举

    枚举(enum),是指一个经过排序的、被打包成一个单一实体的项列表。使用枚举增加程序可读性、降低耦合性。

    /** * 性别枚举 */ public enum Gender { male("男"),female("女"); private String name;

    private Gender(String name) { this.name = name; } public String getName() {

    return name; } }

    二、枚举的基本方法

    对于male枚举常量:

    public class MyMain { public static void main(String[] args) { Gender gender =

    Gender.male; System.out.println(gender.toString()); //Gender.male枚举常量的名称

    System.out.println(gender.getName());//Gender.male的name值

    System.out.println(gender.ordinal());//Gender.male枚举常量的序数 } }

    结果:

    三、Enum与String的转化

    String maleString = Gender.male.toString(); //Gender转化为String Gender

    maleGender = Gender.valueOf("male"); //String转化为Gender,male对应Gender枚举的常量名称

    四、Enum与int的转化

    int maleInt = Gender.male.ordinal(); //Enum转化为int,返回枚举常量的序数 Gender maleGender2

    = Gender.values()[0]; //int转化为Enum,返回第0个枚举常量

    展开全文
  • //可直接根据值来获取枚举类型 System . out . println ( process ) ; //输出CREATED Assert . assertNotNull ( process ) ; } } 相关实现: public interface ConvertibleEnum { Integer ...

    使用

    import lombok.Data;
    import lombok.Getter;
    import lombok.RequiredArgsConstructor;
    
    @RequiredArgsConstructor//为final字段创建构造函数
    public enum Process implements ConvertibleEnum {
        CREATED(1000)//已创建,未提交
        , POSTED(1100)//已提交,未被查看
        , REVIEWED(1200)//已被查看
        ;
    
        @Getter
        private final Integer value;
        public static Converter converter = new Converter();
    
        public static class Converter extends EnumAttributeConverter<Process> {
            public Converter() {
                super(values());
            }
        }
    }
    

    测试:

    import org.junit.Assert;
    import org.junit.Test;
    
    public class EnumConverterTest {
        @Test
        public void test() {
            Process process = Process.converter.convertToEntityAttribute(1000);//可直接根据值来获取枚举类型
            System.out.println(process);//输出CREATED
            Assert.assertNotNull(process);
        }
    }
    

    相关实现:

    public interface ConvertibleEnum {
        Integer getValue();
    }
    
    import javax.persistence.AttributeConverter;
    
    public abstract class EnumAttributeConverter<T extends ConvertibleEnum> implements AttributeConverter<T, Integer> {
        final T[] values;
    
        public EnumAttributeConverter(T[] values) {
            this.values = values;
        }
    
        @Override
        public Integer convertToDatabaseColumn(T attribute) {
            return attribute.getValue();
        }
    
        @Override
        public T convertToEntityAttribute(Integer dbData) {
            for (T value : values) {
                if (value.getValue().equals(dbData))
                    return value;
            }
            return null;
        }
    
        public T convertToEntityAttributeHard(Integer dbData) {
            T t = convertToEntityAttribute(dbData);
            if (t != null)
                return t;
            else throw new IllegalArgumentException("不存在指定枚举" + dbData);
        }
    }
    
    展开全文
  • java 枚举类型与int转换

    千次阅读 2015-11-07 11:16:57
    C++的int枚举互相转换使用强制类型转换即可,但在Java中从int构造Enum需要自己实现(不过如果枚举值从0开始递增就简单了,参考第二段代码)。自定义枚举值代码如下: enum FruitEnum {  APPLE(1), ORANG
  • 阿里巴巴的开发规范里有这么一条: 5.【强制】二方库里可以定义枚举类型,参数可以使用枚举类型,...但是在其他地方是可以使用枚举的,毕竟大家都用int的话,维护起来简直就是地狱。 0、目标 假如我有一个POJO类,里...
  • enum FruitEnum {APPLE... // 调用构造函数来构造枚举项private int value = 0;private FruitEnum(int value) { // 必须是private的,否则编译错误this.value = value;}public static FruitEnum valueOf(int value)...
  • 先说说简单的枚举类型,与字符串,整型之间的转换。可以理解为,枚举,就是一个简单的数组public enum Weather {winter,spring,summer,fall}public class EnumDemo {public ...//枚举转换整型int winter = Weat...
  • 我有一个枚举类型ReportTypeEnum,它在所有类的方法之间传递,但是我需要在URL上传递它,所以我使用序数方法来获取int值。在我把它放到我的另一个JSP页面之后,我需要将它转换回一个ReportTypeEnum,以便继续传递它...
  • 在项目开发过程中经常会遇到数据库存储的是数值,在Java代码枚举表示的字段。这些字段在存储和查询时需要做一个转换:写数据库的时候将枚举转换为数字,读数据库时将数字转换为枚举。 下面介绍一种通过mybatis注解...
  • java 枚举转实体List

    2018-11-08 09:58:00
    public class EnumBean implements Serializable { private static final long serialVersionUID = 1L;... private static final String ENUM_CLASS = "java.lang.Enum"; private int id; privat...
  • 在项目开发中,展示的VO通过Spring MVC序列化后展示给前端,这种方式很常见,但是我们项目中有时会定义很多枚举类,这些枚举类的值是int类型的值存入库中,或者表中的时间类型是int类型或者Date类型,需要转化成可视...
  • Java枚举和C枚举的转换——JNI笔记

    千次阅读 2019-04-18 20:05:45
    前言 最近在做中间件相关,遇到一个JAVA和C之间枚举值通过JNI传递的问题。我们知道C语言的枚举型是一个集合,其每...Java枚举和C枚举的转换本质是Java枚举类型和int整型的转换。 两种枚举的特点 新创建的枚...
  • Javaint类型转枚举类型 在这里我就以我自己的亲身经历为主了。 我在做一个项目时,在数据库中存储的int类型数据,在网页上展示相对应的等级,发现网页上的数据跟数据库中的数据不符合,然后就去追项目代码,在一个...
  • 枚举类:AppSortEnum.javapublic enum AppSortEnum {CORE(0, "核心应用"),ENJOYMENT(1, "娱乐应用"),MESSAGE(2, "消息提醒");private int index;private String name;public int getIndex() {return index;}public ...
  • Java中将Int转换为枚举

    千次阅读 2020-06-24 16:05:07
    What is the correct way to cast an Int to an enum in Java given the following enum? 在给定以下枚举的情况下,将In
  • 最近常常有一些项目需要给枚举设值一个int值,以及对int值进行反解析出枚举类型,代码如下:1 public enumMatchResultEnum {23 /**4 * 赢5 */6 WIN(0),7 /**8 * 输9 */10 LOSE(1),11 /**12 * 平局13 */14 DRAW(2);...
  • C++的int枚举互相转换使用强制类型转换即可,但在Java中从int构造Enum需要自己实现(不过如果枚举值从0开始递增就简单了,参考第二段代码)。自定义枚举值代码如下:==============================代码的分割线====...
  • 框架SpringBoot MyBatis TypeHandler主要使用mybatis中的TypeHandler接口在java中使用如下枚举:public enum Status {DELETED(-1, "已删除"),NORMAL(1, "正常");private final int code;private final String text;...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 324
精华内容 129
关键字:

java枚举转int

java 订阅