함께 쓰는 습관을 들이세요! "너겟 데일리 뉴 플랜 · 4월 업데이트 챌린지" 참여 3일차입니다. 클릭하시면 이벤트 내용을 보실 수 있습니다 .
1. 싱글톤 구현의 3가지 방법
object
먼저 코드를 살펴보세요.
object Pro {
}
复制代码
Pro의 싱글톤을 구현하는 것은 매우 간단합니다. 특정 구현 원칙을 보기 위해 Java 코드로 디컴파일할 수 있습니다.
public final class Pro {
@NotNull
public static final Pro INSTANCE;
private Pro() {
}
static {
Pro var0 = new Pro();
INSTANCE = var0;
}
}
复制代码
먼저 Pro
클래스의 생성자를 로 선언하고 private
, 두 번째로 정적 코드 블록으로 구현한 싱글톤임을 알 수 있는데, 클래스의 정적 코드 블록이 한 번만 실행된다는 특징을 이용 线程安全且饿汉式
하여 ;
자바에서는 Pro.INSTANCE
이 싱글톤을 얻는 반면 kotlin Pro
은 싱글톤을 직접 얻습니다.
lazy
코드 우선:
class Pro private constructor() {
companion object {
val INSTANCE by lazy {
Pro()
}
}
}
复制代码
주로 컴패니언 객체가 선언한 속성을 정적 변수로 사용하며, lazy의 기본 구현 모드는 lock thread-safe입니다. 线程安全且懒汉式
싱글톤 구현입니다. 자세한 lazy
내용 은 Kotlin 개발 사례 중 하나를 참조하세요.
- 이중 확인 잠금
위 코드:
@Volatile
var singleton: Pro? = null
fun getInstance(): Pro {
if (singleton == null) {
synchronized(Pro::class.java) {
if (singleton == null) {
singleton = Pro()
}
}
}
return singleton!!
}
复制代码
위는 Java 이중 확인 잠금의 kotlin 구현입니다. 여기서:
@Volatile
코드 명령어 순서 보장getInstance
메서드의 내부 및 외부 레이어는 초기화가 완료되고 스레드가 잠금을 위해 경쟁할 필요가singleton
없도록 하기 위해 비어 있습니다.singleton
getInstance
singleton
이전 스레드가 초기화된singleton
경우 후속 스레드가 다시 초기화되지 않도록 하기 위해 메서드의 내부 레이어가 비어 있습니다.
보시다시피 이것은 다음 线程安全且懒汉式
과 같은 방식으로 구현된 싱글톤입니다.
2. typealias
복합 유형에 대한 별칭 가져오기
이 typealias
키워드는 주로 유형에 별칭을 지정하는 데 사용되며 다음 두 가지 사용 시나리오가 아래에 설명되어 있습니다.
- 함수 유형 별칭
일상적인 개발에서는 다음과 같은 함수 유형을 일반적으로 사용해야 합니다.
//拼接Int和String类型并返回String类型
val block: ((Int, String) -> String)? = null
复制代码
이 함수 유형 (Int, String) -> String)
은 작성하기 번거롭고 가독성이 좋지 않으므로 이제 typealias
업로드할 시간입니다.
typealias Concat = (Int, String) -> String
val block: Concat? = null
复制代码
사용하기 편리할 뿐만 아니라 (Int, String) -> String)
이 Concat
기능 유형의 사용 시나리오를 보기도 쉽습니다.
- 단순화된 일반 패스
를 사용할 때 ViewModel
인터페이스의 반환을 다음과 같이 캡슐화할 수 있습니다.
class MainViewModel: ViewModel() {
val data: MutableLiveData<Response<String>> = MutableLiveData()
fun test() {
data.value = Response("haha")
}
data class Response<T>(val data: T? = null)
}
复制代码
서버 반환을 캡슐화하는 데 사용 Response
되는 제네릭 형식 T
은 응답 데이터를 역직렬화할 수 있는 엔터티 클래스를 나타냅니다.
위에서 볼 수 있듯이 각 정의 MutableLiveData
는 제네릭 유형으로 선언되어야 합니다 Response<T>
. 왜냐하면 우리 Response
의 것은 모든 인터페이스 응답의 통합 캡슐화이고 한정된 유형이며 그 안의 유형은 각각 동적으로 지정되어야 하는 유형이기 때문 Response<T>
입니다 . T
시간이 생성 됩니다.MutableLiveData
생략할 수 있나요? 이제 Response<T>
업로드할 시간 입니다 .Response
typealias
typealias ExternalLiveData<T> = MutableLiveData<MainViewModel.Response<T>>
复制代码
따라서 생성할 때마다 다음 MutableLiveData
과 같이 작성할 수 있습니다.
val data1: ExternalLiveData<String> = MutableLiveData()
复制代码