【笔记】Java的单例模式最佳实践

前言

Java的单例模式最佳实践

getInstance()

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
public class Singleton implements Serializable {

private static final long serialVersionUID = 1L;

private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}

private Singleton() {
// 防反射攻击:第二次调用构造器时抛异常
if (Holder.INSTANCE != null) {
throw new IllegalStateException("单例已存在,禁止反射创建");
}
}

// 防序列化破坏
protected Object readResolve() {
return Holder.INSTANCE;
}

public static Singleton getInstance() {
return Holder.INSTANCE;
}

public void method() {
System.out.println();
}
}

// 调用方式
public class Client {
public static void main(String[] args) {
Singleton.getInstance().method();
}
}

INSTANCE

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
public enum Singleton {
INSTANCE;

// 可选的业务字段
private String config;

public void init(String config) {
this.config = config;
}

public static Singleton getInstance() {
return INSTANCE;
}

public void method() {
System.out.println();
}
}

// 调用方式
public class Client {
public static void main(String[] args) {
Singleton.INSTANCE.init("production");
Singleton.INSTANCE.method();
}
}

完成