Kotlin 프로젝트 개발 실습 2

함께 쓰는 습관을 들이세요! "너겟 데일리 뉴 플랜 · 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 구현입니다. 여기서:

  1. @Volatile코드 명령어 순서 보장
  2. getInstance메서드의 내부 및 외부 레이어는 초기화가 완료되고 스레드가 잠금을 위해 경쟁할 필요가 singleton없도록 하기 위해 비어 있습니다.singleton
  3. getInstancesingleton이전 스레드가 초기화된 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>업로드할 시간 입니다 .Responsetypealias

typealias ExternalLiveData<T> = MutableLiveData<MainViewModel.Response<T>>
复制代码

따라서 생성할 때마다 다음 MutableLiveData과 같이 작성할 수 있습니다.

val data1: ExternalLiveData<String> = MutableLiveData()
复制代码

추천

출처juejin.im/post/7082560219615592456