Kotlin 의 확장 함수 와 속성 예시 상세 설명

머리말
Kotlin 에서 클래스 의 확장 방법 은 원래 의 내부 에서 확장 하 는 것 이 아니 라 자바 코드 로 역 컴 파일 된 것 을 통 해 알 수 있 듯 이 그 원 리 는 장식 모델 을 사용 하고 소스 인 스 턴 스 에 대한 조작 과 포장 이다.그 원 리 는 우리 가 자바 에서 정의 한 도구 류 방법 과 같 고 이 도구 류 방법 은 호출 자 를 첫 번 째 매개 변수 로 사용 하 는 것 이다.그리고 도구 방법 에서 이 호출 자 를 조작 합 니 다.
이론 적 으로 확장 함 수 는 매우 간단 하 다.이것 은 하나의 구성원 함수 이지 만 클래스 의 밖 에 정의 된다.문자열 의 마지막 문 자 를 계산 하 는 방법 을 추가 합 니 다.

package strings
/**
 * @author :Reginer in 2018/5/22 21:04.
 *     :QQ:282921012
 *     :
 */
fun String.lastChar(): Char = get(this.length - 1)
확장 할 클래스 나 인터페이스의 이름 을 추가 할 함수 앞 에 놓 는 것 입 니 다.이 종류의 이름 은 수신 자 유형 이 라 고 합 니 다.이 확장 함 수 를 호출 하 는 대상 을 수신 자 대상 이 라 고 합 니 다.

수신 자 형식 은 확장 함수 로 정의 되 며,수신 대상 은 이 유형의 인 스 턴 스 입 니 다.
호출 클래스 의 구성원 함수 처럼 이 함 수 를 호출 할 수 있 습 니 다:

println("Kotlin".lastChar())
>n
어떤 의미 에서 볼 때 이 제 는 String 류 에 자신의 방법 을 추가 했다.String 클래스 가 자바,Kotlin,Groovy 와 같은 다른 JVM 언어 로 작 성 됐 든 자바 클래스 로 컴 파일 될 수만 있다 면 이 클래스 에 확장 자 를 추가 할 수 있 습 니 다.
이 확장 함수 에 서 는 다른 멤버 함수 처럼 this 를 사용 할 수 있 습 니 다.일반 멤버 함수 처럼 생략 할 수도 있 습 니 다.

fun String.lastChar(): Char = get(this.length - 1)
확장 함 수 는 포장 성 을 깨 뜨리 는 것 을 허용 하지 않 습 니 다.클래스 내부 에서 정의 하 는 방법 과 달리 확장 함 수 는 개인 이나 보 호 받 는 구성원 에 게 접근 할 수 없습니다.
3.3.1 가 져 오기 및 확장 함수
정 의 된 확장 함수 에 대해 서 는 전체 항목 범위 내 에서 자동 으로 적용 되 지 않 습 니 다.반대로 이 를 사용 하려 면 다른 어떤 클래스 나 함수 처럼 가 져 와 야 합 니 다.우연 한 명명 충돌 을 피하 기 위해 서다.Kotlin 은 가 져 오기 클래스 와 같은 문법 으로 하나의 함 수 를 가 져 올 수 있 습 니 다.

import strings.lastChar
//    
import strings.*
3.3.2 자바 에서 확장 함수 호출
사실 확장 함 수 는 정적 함수 로 호출 대상 을 첫 번 째 매개 변수 로 합 니 다.확장 함 수 를 호출 하면 적당 한 대상 을 만 들 거나 실행 할 때의 추가 소 모 를 만 들 지 않 습 니 다.
이것 은 자바 에서 Kotlin 을 호출 하 는 확장 함 수 를 매우 간단하게 만 들 었 습 니 다.이 정적 함 수 를 호출 한 다음 에 수신 대상 을 첫 번 째 매개 변수 로 전송 하면 됩 니 다.StringUtil.kt 라 는 파일 에 설명 한다 고 가정 합 니 다.

char c = StringUtil.lastChar("Java");
Kotlin 버 전과 비교 하면 가 독성 이 약간 떨어진다.
3.3.3 확장 함수 로 서 의 도구 함수
이제 join ToString 함수 의 최종 버 전 을 쓸 수 있 습 니 다.

fun <T> Collection<T>.joinToString(separator: String = ", ", prefix: String = "", postfix: String = ""): String {
 val result = StringBuilder(prefix)
 for ((index, element) in this.withIndex()) {
 if (index > 0) result.append(separator)
 result.append(element)
 }
 result.append(postfix)
 return result.toString()
}
확장 함 수 는 정적 함수 의 효율 적 인 문법 사탕 이 아니 라 수신 자 유형 으로 더 구체 적 인 유형 을 사용 할 수 있 기 때문이다.join 함 수 를 원한 다 면 문자열 의 집합 으로 만 실행 할 수 있 습 니 다:

fun Collection<String>.join(separator: String = ", ", prefix: String = "", postfix: String = ""): String {
 val result = StringBuilder(prefix)
 for ((index, element) in this.withIndex()) {
 if (index > 0) result.append(separator)
 result.append(element)
 }
 result.append(postfix)
 return result.toString()
}
다른 유형의 대상 목록 으로 호출 하면 오류 가 발생 합 니 다.
3.3.4 다시 쓸 수 없 는 확장 함수
확장 함 수 는 클래스 의 일부분 이 아 닙 니 다.클래스 이외 의 것 을 설명 합 니 다.확장 함 수 는 재 작성 이 존재 하지 않 습 니 다.Kotlin 은 정적 함수 로 취급 하기 때 문 입 니 다.
3.3.5 확장 속성

val String.lastChar: Char get() = get(this.length - 1)
확장 함수 와 마찬가지 로 확장 속성 도 수신 자의 일반 구성원 속성 과 같 습 니 다.
지원 필드 가 없 기 때문에 기본 getter 의 구현 이 없습니다.getter 함 수 를 정의 해 야 합 니 다.초기 값 을 저장 할 곳 이 없 기 때문에 초기 화 도 안 됩 니 다.
StringBuilder 에서 같은 속성 을 정의 하면 var 로 설정 할 수 있 습 니 다.StringBuilder 의 내용 은 가 변 적 이기 때 문 입 니 다.

var StringBuilder.lastChar: Char
 get() = get(length - 1)
 set(value) {
 this.setCharAt(length - 1, value)
 }
구성원 속성 에 접근 하 는 것 처럼 접근 할 수 있 습 니 다:

println("Kotlin".lastChar)
> n
val sb = StringBuilder("Kotlin?")
sb.lastChar = '!'
println(sb)
> Kotlin!
자바 에서 확장 속성 에 접근 하려 면 getter 함수:StringUtil.getLastChar("자바")를 명시 적 으로 호출 해 야 합 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기