Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Latest commit

 

History

History
History
71 lines (58 loc) · 2.97 KB

File metadata and controls

71 lines (58 loc) · 2.97 KB
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
### 枚举是如何保证线程安全的
要想看源码首先得有一个类吧那么枚举类型到底是什么类呢是enum吗答案很明显不是enum就和class一样只是一个关键字他并不是一个类那么枚举是由什么类维护的呢我们简单的写一个枚举
public enum t {
SPRING,SUMMER,AUTUMN,WINTER;
}
然后我们使用反编译看看这段代码到底是怎么实现的反编译(<a href="/archives/58" target="_blank">Java的反编译</a>)后代码内容如下
public final class T extends Enum
{
private T(String s, int i)
{
super(s, i);
}
public static T[] values()
{
T at[];
int i;
T at1[];
System.arraycopy(at = ENUM$VALUES, 0, at1 = new T[i = at.length], 0, i);
return at1;
}
public static T valueOf(String s)
{
return (T)Enum.valueOf(demo/T, s);
}
public static final T SPRING;
public static final T SUMMER;
public static final T AUTUMN;
public static final T WINTER;
private static final T ENUM$VALUES[];
static
{
SPRING = new T("SPRING", 0);
SUMMER = new T("SUMMER", 1);
AUTUMN = new T("AUTUMN", 2);
WINTER = new T("WINTER", 3);
ENUM$VALUES = (new T[] {
SPRING, SUMMER, AUTUMN, WINTER
});
}
}
通过反编译后代码我们可以看到,`public final class T extends Enum`,说明该类是继承了Enum类的同时final关键字告诉我们这个类也是不能被继承的当我们使用`enmu`来定义一个枚举类型的时候编译器会自动帮我们创建一个final类型的类继承Enum类,所以枚举类型不能被继承我们看到这个类中有几个属性和方法
我们可以看到
public static final T SPRING;
public static final T SUMMER;
public static final T AUTUMN;
public static final T WINTER;
private static final T ENUM$VALUES[];
static
{
SPRING = new T("SPRING", 0);
SUMMER = new T("SUMMER", 1);
AUTUMN = new T("AUTUMN", 2);
WINTER = new T("WINTER", 3);
ENUM$VALUES = (new T[] {
SPRING, SUMMER, AUTUMN, WINTER
});
}
都是static类型的因为static类型的属性会在类被加载之后被初始化我们在<a href="/archives/199" target="_blank">深度分析Java的ClassLoader机制源码级别)</a><a href="/archives/201" target="_blank">Java类的加载链接和初始化</a>两个文章中分别介绍过当一个Java类第一次被真正使用到的时候静态资源被初始化Java类的加载和初始化过程都是线程安全的所以,**创建一个enum类型是线程安全的**。
Morty Proxy This is a proxified and sanitized view of the page, visit original site.