前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础

Java基础

原创
作者头像
用户7678152
修改2020-08-26 14:20:22
4240
修改2020-08-26 14:20:22
举报
文章被收录于专栏:嵌入式嵌入式嵌入式

前言:


  在第一次学习面向对象编程时,我记得最深的一句话就是“万物皆对象”。于是我一直秉承着这个思想努力的学习着JAVA,直到学习到枚举(Enum)时,看着它颇为奇怪的语法……我一直在想,这TM是个什么鬼???当时学习OOP时也是被类啊接口什么的整的有点昏头转向的于是就把这个小细节忽略掉了。后来到了公司工作后慢慢的又需要用上枚举了,看着它一副神秘兮兮的样子我还是决定要好好的深挖一下!以下链接是了解枚举时所参考的博客。如发现本文有错误或知识遗漏欢迎在评论中指正!

反编译那些事儿(二)—枚举的反编译:http://blog.csdn.net/gaohuanjie/article/details/18140279

JAVA枚举与常量类的区别:http://blog.csdn.net/tanqian351/article/details/53736628

目录:


   1)历史

  2)语法解析

  3)枚举的好处以及与常量类的区别

  4)枚举常用方法

1.历史:


  枚举是JDK1.5版本新增的特性(泛型、For-each等如今被广泛应用的特性也是由JDK1.5时所新增的),另外到了JDK1.6后switch语句支持枚举类型。

2.枚举的语法解析:


  1.最最最简单版

public enum ColorEnum {
 RED,BLUE,GREEN
}

通过工具解析class后获得的源代码(工具参考上面的链接)

public final class ColorEnum extends Enum
{

    //返回存储枚举实例的数组的副本。values()方法通常用于foreach循环遍历枚举常量。
    public static ColorEnum[] values()
    {
        return (ColorEnum[])$VALUES.clone();
    }
    //根据实例名获取实例
    public static ColorEnum valueOf(String s)
    {
        return (ColorEnum)Enum.valueOf(ColorEnum, s);
    }

    //私有构造方法,这里调用了父类的构造方法,其中参数s对应了常量名,参数i代表枚举的一个顺序(这个顺序与枚举的声明顺序对应,用于oridinal()方法返回顺序值)
    private ColorEnum(String s, int i)
    {
        super(s, i);
    }

    //我们定义的枚举在这里声明了三个 ColorEnum的常量对象引用,对象的实例化在static静态块中
    public static final ColorEnum RED;
    public static final ColorEnum BLUE;
    public static final ColorEnum GREEN;
    //将所有枚举的实例存放在数组中
    private static final ColorEnum $VALUES[];

    static 
    {
        RED = new ColorEnum("RED", 0);
        BLUE = new ColorEnum("BLUE", 1);
        GREEN = new ColorEnum("GREEN", 2);
        //将所有枚举的实例存放在数组中
        $VALUES = (new ColorEnum[] {
            RED, BLUE, GREEN
        });
    }
}

 2.现在我们在枚举类中增加自己的字段以及一些辅助方法,代码如下:

public enum ColorEnum {
    RED("red","红色"),GREEN("green","绿色"),BLUE("blue","蓝色");
    //防止字段值被修改,增加的字段也统一final表示常量
    private final String key;
    private final String value;
    
    private ColorEnum(String key,String value){
        this.key = key;
        this.value = value;
    }
    //根据key获取枚举
    public static ColorEnum getEnumByKey(String key){
        if(null == key){
            return null;
        }
        for(ColorEnum temp:ColorEnum.values()){
            if(temp.getKey().equals(key)){
                return temp;
            }
        }
        return null;
    }
    public String getKey() {
        return key;
    }
    public String getValue() {
        return value;
    }
}

老规矩,反编译看看变化?(其实也就看看static静态块和构造方法有什么变化就好了)

public final class ColorEnum extends Enum

{

public static ColorEnum[] values()

{

return (ColorEnum[])$VALUES.clone();

}

public static ColorEnum valueOf(String s)

{

return (ColorEnum)Enum.valueOf(ColorEnum, s);

}

//构造方法在原基础上加上我们新增的两个形参

private ColorEnum(String s, int i, String s1, String s2)

{

super(s, i);

key = s1;

value = s2;

}

//自定义方法,通过key值获得对应的枚举对象

public static ColorEnum getEnumByKey(String s)

{

if(null == s)

return null;

ColorEnum acolorenum[] = values();

int i = acolorenum.length;

for(int j = 0; j < i; j++)

{

ColorEnum colorenum = acolorenum[j];

if(colorenum.getKey().equals(s))

return colorenum;

}

return null;

}

public String getKey()

{

return key;

}

public String getValue()

{

return value;

}

public static final ColorEnum RED;

public static final ColorEnum GREEN;

public static final ColorEnum BLUE;

//我们自定义的两个字段

private final String key;

private final String value;

private static final ColorEnum $VALUES[];

static

{

RED = new ColorEnum("RED", 0, "red", "\u7EFE\u3223\u58CA");

GREEN = new ColorEnum("GREEN", 1, "green", "\u7F01\u80EF\u58CA");

BLUE = new ColorEnum("BLUE", 2, "blue", "\u9483\u6FCA\u58CA");

$VALUES = (new ColorEnum[] {

RED, GREEN, BLUE

});

}

}

3.枚举的好处以及与常量类的区别


  1)枚举型可以直接与数据库打交道,我通常使用varchar类型存储,对应的是枚举的常量名。(数据库中好像也有枚举类型,不过也没用过)

  2) switch语句支持枚举型,当switch使用int、String类型时,由于值的不稳定性往往会有越界的现象,对于这个的处理往往只能通过if条件筛选以及default模块来处理。而使用枚举型后,在编译期间限定类型,不允许发生越界的情况

  3) 当你使用常量类时,往往得通过equals去判断两者是否相等,使用枚举的话由于常量值地址唯一,可以用==直接对比,性能会有提高

  4) 常量类编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,需要重新编译引用常量的类,因为里面存的是旧值。枚举类编译时,没有把常量值编译到代码里,即使常量的值发生变化,也不会影响引用常量的类。

  5)枚举类编译后默认为final class,不允许继承可防止被子类修改。常量类可被继承修改、增加字段等,容易导致父类的不兼容。

………………欢迎补充!

  总结:常量的定义在开发中是必不可少的,虽然无论是通过常量类定义常量还是枚举定义常量都可以满足常量定义的需求。但个人建议最好是使用枚举类型。

4.枚举常用方法


1.values()获取存储枚举中所有常量实例的数组。常配合foreach完成遍历

    for(ColorEnum temp:ColorEnum.values()){
            System.out.println(temp);
    }

运行结果:

  RED
  GREEN
  BLUE

2.构造方法,枚举的构造方法只能用private修饰符修饰,原因就不需要解释了……

  3.valueOf()通过常量名获取对应的枚举实例。

  ColorEnum red = ColorEnum.valueOf("RED");
  System.out.println(red);

参考资料:

java-环境搭建及基础语法

Java基础

精讲java IO流基础学习

集合

构造函数/继承

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 目录:
  • 1.历史:
  • 2.枚举的语法解析:
  • 3.枚举的好处以及与常量类的区别
  • 4.枚举常用方法
  • 参考资料:
相关产品与服务
物联网
腾讯连连是腾讯云物联网全新商业品牌,它涵盖一站式物联网平台 IoT Explorer,连连官方微信小程序和配套的小程序 SDK、插件和开源 App,并整合腾讯云内优势产品能力,如大数据、音视频、AI等。同时,它打通腾讯系 C 端内容资源,如QQ音乐、微信支付、微保、微众银行、医疗健康等生态应用入口。提供覆盖“云-管-边-端”的物联网基础设施,面向“消费物联”和 “产业物联”两大赛道提供全方位的物联网产品和解决方案,助力企业高效实现数字化转型。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档