디자인 패턴을 kotlin으로 써 보았다 Singleton 편
이번에는 Singleton에 대해 정리합니다.
※또, 코멘트란에 리뷰를 받았습니다 @sdkei 씨 감사합니다.
리뷰를 바탕으로 수정했습니다 내용을 반영 했으므로, 그 점도 근거로 써 가려고 생각합니다.
Singleton이란?
singleton이란 요소를 하나만 갖고 있는 집합을 가리키는 말로 아래 역할을 하는 패턴으로 정의되어 있습니다.
Singleton 클래스
이 클래스에서는 static 필드로서 정의된
singleton
멤버에 Singleton 클래스의 인스턴스로 초기화하고 있습니다만, 클래스의 로드시에 한 번만 초기화가 행해집니다.또, private로 외부로부터의 액세스를 막는 것으로 인스턴스가 1개 밖에 생성되지 않는 것을 보증하고 있다는 것.
kotlin의 경우 static이라는 정의는 없으며 대신
companion object
를 정의합니다.참고 : Kotlin에서 static 멤버를 어떻게 써야 하나요?
또,
companion object
를 정의해 디컴파일하면 Companion 객체를 개입시킨 getter/setter로부터 액세스 하게 되므로 const인가 @JvmField 를 사용한다고 하는 것.그러나 const는 프리미티브형이나 String형만이므로 비프리미티브형은 @JvmField을 지정하고, 프리미티브형을 @JvmField 지정하면 2회 초기값을 대입하기 위해 구분할 필요가 있다는 것.
단, @JvmField 는 Field에 가시성을 가지기 위해서 사용하기 때문에, 이번 private에서는 사용할 수 없었다.
참고:
【Kotlin】 【Java】 Kotlin Java 비교 메모
Calling Kotlin from Java
추가 사항 : @sdkei 님 리뷰 감사합니다!
리뷰를 받고, 위와 같은 구현이 아니어도 Kotlin에는 객체 선언을 사용해 보다 용이하게 구현할 수 있게 되어 있다고 하는 것입니다.
⇒
Singleton2.kt
, SingletonSample2.kt
참고:
Kotlin에서 디자인 패턴 Singleton 편
객체 표현 및 선언
Singleton.java
class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {
System.out.println("インスタンスを生成しました。");
}
public static Singleton getInstance() {
return singleton;
}
}
Singleton.kt
class Singleton {
init { println("インスタンスを生成しました。") }
companion object {
private val singleton = Singleton()
fun getInstance() = this.singleton
}
}
Singleton2.kt
object Singleton {
init { println("インスタンスを生成しました。") }
}
Main 클래스
SingletonSample.java
public class SingletonSample {
public static void main(String[] args) {
System.out.println("Start.");
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
if (s1 == s2) {
System.out.println("s1とs2は同じインスタンスです。");
} else {
System.out.println("s1とs2は同じインスタンスではありません。");
}
System.out.println("End.");
}
}
SingletonSample.kt
fun main(args: Array<String>) {
println("Start.")
val s1 = Singleton.getInstance()
val s2 = Singleton.getInstance()
if (s1 == s2) println("s1とs2は同じインスタンスです。")
else println("s1とs2は同じインスタンスではありません。")
println("End.")
}
SingletonSample2.kt
fun main(args: Array<String>) {
println("Start.")
val s1 = Singleton
val s2 = Singleton
if (s1 == s2) println("s1とs2は同じインスタンスです。")
else println("s1とs2は同じインスタンスではありません。")
println("End.")
}
실행 결과
Start.
インスタンスを生成しました。
s1とs2は同じインスタンスです。
End.
클래스 다이어그램
소감
singleton
를 정의한다 companion object {}
, 비프리미티브형은 const
참고
아래를 참고로 하겠습니다. 매우 읽기 쉽고 이해하기 쉬웠습니다.
Kotlin에서 static 멤버를 어떻게 써야 하나요?
【Kotlin】 【Java】 Kotlin Java 비교 메모
Calling Kotlin from Java
Kotlin에서 디자인 패턴 Singleton 편
객체 표현 및 선언
Reference
이 문제에 관하여(디자인 패턴을 kotlin으로 써 보았다 Singleton 편), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Takunawa/items/5a0505142f06e77064a4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)