TIL

아이템 1 가변성을 제한하라

코틀린에서 가변성 제한하기

읽기 전용 프로퍼티 (val)

val list = mutableListOf(1, 2, 3)
var name: String = "Marcin"
var surname: String = "Moskaja"
val fullname 
	get() = "$name $surname"

가변 컬렉션과 읽기 전용 컬렉션 구분하기

val list = listOf(1, 2, 3)

if (list is MutableList) { // 이렇게 하지 말자
	list.add(4)
}

데이터 클래스의 copy

data class User(
	val name: String,
	val surname: String
)

var user = User("Maja", "Markiewicz")
user = user.copy(surname = "Moskaja")

다른 종류의 변경 가능 지점

val list1: MutableList<Int> = mutableListOf()
var list2: List<Int> = listOf()

// 두 가지 모두 변경 가능하다.
list1.add(1)
list2 = list2 + 1
var announcements = listOf<Announcement>()
	private set

변경 가능 지점 노출하지 말기

class UserHolder {
	private val user: MutableUser()
	
	fun get(): MutableUser = user.copy() // 방어적 복제
}

class UserRepository {
	private val storedUsers: MutableMap<Int, String> = 
		mutableMapOf()
		
	fun loadAll(): Map<Int, String> { // 업캐스팅
		return storedUsers
	}
}

정리