자바에서 싱글톤을 생성하려면 여러가지 방법이 있다.
public class Singleton {
private static Singleton singleton;
private Singleton(){}
//1. getInstance메서드를 통한 초기화 지연
/*
public static Singleton getInstance(){
if(singleton == null) singleton = new Singleton();
return singleton;
}
*/
//2. 싱글톤 스레드 세이프
public static synchronized Singleton getInstance(){
if(singleton == null) singleton = new Singleton();
return singleton;
}
// 인스턴스가 필요한 시점에 동적 바인딩을 통해 생성되어 Thread-safe
//3. synchronized 사용하지 않고 자원 낭비 없이 스레드 세이프하게 싱글톤
private static class Holder{
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance(){
return Holder.instance;
}
}
synchronized와 getInstance함수, 그리고 이너 클래스를 이용하여 스레드세이프하게 만든다.
그렇다면 이제 코틀린에서 싱글톤으로 구현해보자
class Singleton private constructor(context: Context) {
companion object {
@Volatile
private var singleton: Singleton? = null
fun getInstance(context: Context) =
singleton ?: synchronized(Singleton::class.java) {
singleton ?: Singleton(context).also {
singleton = it
}
}
}
}
synchronized로 인스턴스가 null인 경우 생성하여 반환해준다.