用私有构造器或者枚举强化单例
首先对单单例,构造函数需要私有化,这样能够极大的保障外部无法直接实例化该对象
单例在面试中经常会有面试官要求写,下面列出几种常用的写法:
懒汉式(线程不安全写法,与之相对的还有线程安全的写法不赘述)
1 | public class Singleton { |
饿汉式(线程不安全写法,与之相对的还有线程安全的写法不赘述)
1 | public class Singleton { |
对于上面这种写法,在书中有提到如果首行代码是public的话可以通过反射机制多实例化对象。如下举例:
1 | package com.stardust.effective.role3; |
枚举实现单例,这个是effective java书中推荐的实现方式,枚举天然私有构造,final,static等特性,可以生产一个懒加载的单例1
2
3
4
5
6public enum Singletons {
INSTANCE;
public void say() {
System.out.println("animal say");
}
}
从网上找的一个具体的例子,SomeThing.INSTANCE.getInstance() 即可获得所要实例1
2
3
4
5
6
7
8
9
10
11
12
13class Resource{
}
public enum SomeThing {
INSTANCE;
private Resource instance;
SomeThing() {
instance = new Resource();
}
public Resource getInstance() {
return instance;
}
}