2024最值得加入的互联网公司有哪些,【Java基础】枚举

原理


那我们定义枚举类型后,到底发生了什么呢?我们对枚举的实现原理进行探究。

我们来解析下Color.class文件,命令javap Color

public final class Color extends java.lang.Enum {

public static final Color Red;

public static final Color Blue;

public static final Color Green;

public static final Color[] $VALUES;

public static Color[] values();

public static Color valueOf(java.lang.String);

static {};

}

从解析后的文件中我们可以知道

1.枚举类是final 的,不能被继承

2.枚举类在经过编译后生成一个继承java.lang.Enum 的类 Color

3.编译后的枚举值,是该类的Color类型的成员变量,如 Red、Bule、Green ,并且是final static 修饰

4.枚举编译后的类添加了静态的values()valueOf(java.lang.String) 方法

5.静态代码块static {}

进一步细化Color.class

命令javap -c Color

public final class Color extends java.lang.Enum {

public static final Color Red;

public static final Color Blue;

public static final Color Green;

public static Color[] values();

Code:

0: getstatic #1 // Field $VALUES:[LColor;

3: invokevirtual #2 // Method “[LColor;”.clone:()Ljava/lang/Object;

6: checkcast #3 // class “[LColor;”

9: areturn

public static Color valueOf(java.lang.String);

Code:

0: ldc #4 // class Color

2: aload_0

3: invokestatic #5 // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljav

a/lang/Enum;

6: checkcast #4 // class Color

9: areturn

static {};

Code:

0: new #4 // class Color

3: dup

4: ldc #7 // String Red

6: iconst_0

7: invokespecial #8 // Method “”:(Ljava/lang/String;I)V

10: putstatic #9 // Field Red:LColor;

13: new #4 // class Color

16: dup

17: ldc #10 // String Blue

19: iconst_1

20: invokespecial #8 // Method “”:(Ljava/lang/String;I)V

23: putstatic #11 // Field Blue:LColor;

26: new #4 // class Color

29: dup

30: ldc #12 // String Green

32: iconst_2

33: invokespecial #8 // Method “”:(Ljava/lang/String;I)V

36: putstatic #13 // Field Green:LColor;

39: iconst_3

40: anewarray #4 // class Color

43: dup

44: iconst_0

45: getstatic #9 // Field Red:LColor;

48: aastore

49: dup

50: iconst_1

51: getstatic #11 // Field Blue:LColor;

54: aastore

55: dup

56: iconst_2

57: getstatic #13 // Field Green:LColor;

60: aastore

61: putstatic #1 // Field $VALUES:[LColor;

64: return

}

还原后的代码如下:

public final class Color extends java.lang.Enum {

//定义的枚举成员

public static final Color Red;

public static final Color Blue;

public static final Color Green;

//编译器自动生成的 javap -c 还查不出来,疑惑

public static final /* synthetic */ Color[] $VALUES;//编译器自动生成的

public static Color[] values(){

/**

  • 0: getstatic #1 // Field $VALUES:[LColor;

  • 3: invokevirtual #2 // Method “[LColor;”.clone:()Ljava/lang/Object;

  • 6: checkcast #3 // class “[LColor;”

  • 9: areturn

*/

return $VALUES.clone();

}

public static Color valueOf(java.lang.String s){

/**

  • 0: ldc #4 // class Color

  • 2: aload_0

  • 3: invokestatic #5 // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljav

  • a/lang/Enum;

  • 6: checkcast #4 // class Color

  • 9: areturn

*/

return Enum.valueOf(Color.class,s);

}

protected Color(String name, int ordinal) {

super(name, ordinal);

}

static {

/**

  • 0: new #4 // class Color

  • 3: dup

  • 4: ldc #7 // String Red

  • 6: iconst_0

  • 7: invokespecial #8 // Method “”:(Ljava/lang/String;I)V

  • 10: putstatic #9 // Field Red:LColor;

*/

Red=new Color(“Red”,0);

/**

  • 13: new #4 // class Color

  • 16: dup

  • 17: ldc #10 // String Blue

  • 19: iconst_1

  • 20: invokespecial #8 // Method “”:(Ljava/lang/String;I)V

  • 23: putstatic #11 // Field Blue:LColor;

*/

Blue=new Color(“Blue”,1);

/**

  • 26: new #4 // class Color

  • 29: dup

  • 30: ldc #12 // String Green

  • 32: iconst_2

  • 33: invokespecial #8 // Method “”:(Ljava/lang/String;I)V

  • 36: putstatic #13 // Field Green:LColor;

*/

Green=new Color(“Green”,2);

/**

  • 39: iconst_3

  • 40: anewarray #4 // class Color

  • 43: dup

  • 44: iconst_0

  • 45: getstatic #9 // Field Red:LColor;

  • 48: aastore

  • 49: dup

  • 50: iconst_1

  • 51: getstatic #11 // Field Blue:LColor;

  • 54: aastore

  • 55: dup

  • 56: iconst_2

  • 57: getstatic #13 // Field Green:LColor;

  • 60: aastore

  • 61: putstatic #1 // Field $VALUES:[LColor;

*/

$VALUES=new Color[]{Red,Blue,Green};

};

}

通过上面还原后的代码可知,在类的static代码块 中编译器帮我们生成枚举中的每个成员,实际上就是生成对象并赋值给静态变量。

枚举的扩展


单例模式


枚举其实就是编译帮我们在静态代码块中创建一个或多个枚举成员对象,如果我们只定义一个枚举成员,这样就是一个单例对象

public enum Singleton {

INSTANCE;

public void doSometing(){

System.out.println(“doing”);

}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

既已说到spring cloud alibaba,那对于整个微服务架构,如果想要进一步地向上提升自己,到底应该掌握哪些核心技能呢?

就个人而言,对于整个微服务架构,像RPC、Dubbo、Spring Boot、Spring Cloud Alibaba、Docker、kubernetes、Spring Cloud Netflix、Service Mesh等这些都是最最核心的知识,架构师必经之路!下图,是自绘的微服务架构路线体系大纲,如果有还不知道自己该掌握些啥技术的朋友,可根据小编手绘的大纲进行一个参考。

image

如果觉得图片不够清晰,也可来找小编分享原件的xmind文档!

且除此份微服务体系大纲外,我也有整理与其每个专题核心知识点对应的最强学习笔记:

  • 出神入化——SpringCloudAlibaba.pdf

  • SpringCloud微服务架构笔记(一).pdf

  • SpringCloud微服务架构笔记(二).pdf

  • SpringCloud微服务架构笔记(三).pdf

  • SpringCloud微服务架构笔记(四).pdf

  • Dubbo框架RPC实现原理.pdf

  • Dubbo最新全面深度解读.pdf

  • Spring Boot学习教程.pdf

  • SpringBoo核心宝典.pdf

  • 第一本Docker书-完整版.pdf

  • 使用SpringCloud和Docker实战微服务.pdf

  • K8S(kubernetes)学习指南.pdf

image

另外,如果不知道从何下手开始学习呢,小编这边也有对每个微服务的核心知识点手绘了其对应的知识架构体系大纲,不过全是导出的xmind文件,全部的源文件也都在此!

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
o最新全面深度解读.pdf

  • Spring Boot学习教程.pdf

  • SpringBoo核心宝典.pdf

  • 第一本Docker书-完整版.pdf

  • 使用SpringCloud和Docker实战微服务.pdf

  • K8S(kubernetes)学习指南.pdf

[外链图片转存中…(img-EImI48wO-1713291745983)]

另外,如果不知道从何下手开始学习呢,小编这边也有对每个微服务的核心知识点手绘了其对应的知识架构体系大纲,不过全是导出的xmind文件,全部的源文件也都在此!

[外链图片转存中…(img-Rgp5qsFZ-1713291745983)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 27
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值