Java 和Kotlin的单例模式其实很像,只是Kotlin一部分单例可以用对象类和委托lazy来实现
Java
/**
* 懒汉式,线程不安全
*/
class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
/**
* 懒汉式,线程安全
*/
class Singleton1 {
private static Singleton1 instance;
private Singleton1() {
}
public static synchronized Singleton1 getInstance() {
if (instance == null) {
instance = new Singleton1();
}
return instance;
}
}
/**
* 饿汉式
*/
class Singleton2 {
private static Singleton2 instance = new Singleton2();
private Singleton2() {
}
public static Singleton2 getInstance() {
return instance;
}
}
/**
* 双检锁/双重校验锁(DCL,即 double-checked locking)
*/
class Singleton3 {
private volatile static Singleton3 singleton;
private Singleton3() {
}
public static Singleton3 getSingleton() {
if (singleton == null) {
synchronized (Singleton3.class) {
if (singleton == null) {
singleton = new Singleton3();
}
}
}
return singleton;
}
}
/**
* 登记式/静态内部类
*/
class Singleton4 {
private static class SingletonHolder {
private static final Singleton4 INSTANCE = new Singleton4();
}
private Singleton4() {
}
public static final Singleton4 getInstance() {
return SingletonHolder.INSTANCE;
}
}
/**
* 枚举
*/
enum Singleton5 {
INSTANCE2;
public void whateverMethod() {
System.out.println("....");
}
}
Kotlin
/**
* 懒汉式,线程不安全,仿Java
*/
internal class Singleton6 private constructor() {
companion object {
private var instance: Singleton6? = null
fun getInstance(): Singleton6 {
if (instance == null) {
instance = Singleton6()
}
return instance!!
}
}
}
/**
* 懒汉式,线程不安全
*/
internal class Singleton7 private constructor() {
companion object {
var instance: Singleton7? = null
get() {
if (field == null) {
field = Singleton7()
}
return field
}
}
}
/**
* 懒汉式,线程安全
*/
internal class Singleton8 private constructor() {
companion object {
@get:Synchronized
var instance: Singleton8? = null
get() {
if (field == null) {
field = Singleton8()
}
return field
}
}
}
/**
*饿汉式
*/
internal object Singleton9 {
fun whateverMethod() {
println("....")
}
}
/**
*饿汉式,仿Java
*/
internal class Singleton10 private constructor() {
companion object {
val instance = Singleton10()
}
}
/**
* 双检锁/双重校验锁(DCL,即 double-checked locking)
*/
internal class Singleton12 private constructor() {
companion object {
val instance: Singleton12 by lazy {
Singleton12()
}
}
}
/**
* 双检锁/双重校验锁(DCL,即 double-checked locking),仿Java
*/
internal class Singleton11 private constructor() {
companion object {
@Volatile
var instance: Singleton11? = null
get() {
if (field == null) {
synchronized(Singleton11::class) {
if (field == null) {
field = Singleton11()
}
}
}
return field
}
}
}
/**
* 登记式/静态内部类
*/
internal class Singleton13 {
private object SingletonHolder {
val INSTANCE = Singleton13()
}
companion object {
val instance: Singleton13
get() = SingletonHolder.INSTANCE
}
}
/**
* 枚举
*/
internal enum class Singleton14 {
INSTANCE;
fun whateverMethod() {
println("....")
}
}