TIL

아이템 45 불필요한 객체 생성을 피하라

객체 생성 비용은 항상 클까?

객체 선언

sealed class LinkedList<out T>

class Node<out T>(
	val head: T,
	val tail: LinkedList<T>,
): LinkedList<T>()

// 링크드리스트에서 Empty 노드를 싱글톤으로 사용
class Empty<T>: LinkedList<T>()

// 사용
val list: LinkedList<Int> = Node(1, Node(2, Node(3, Empty())))

캐시를 활용하는 팩토리 함수

fun <T> emptyList(): List<T> {
	return EMPTY_LIST
}
private val FIB_CACHE = mutableMapOf<Int, BigInteger>()

fun fib(n: Int): BigInteger = FIB_CACHE.getOrPut(n) {
	if (n <= 1) BigInteger.ONE else fib(n - 1) + fib(n - 2)
}

무거운 객체를 외부 스코프로 보내기

// 컬렉션 내부의 최댓값 수를 세는 확장 함수
fun <T: Comparable<T>> Iterable<T>.countMax(): Int {
	val max = this.max() // max 값을 찾아 두고 이를 활용해서 수를 세기에 가독성과 성능이 좋아진다.
	return count { it == max }
}
private val IS_VALID_EMAIL_REGEX by lazy {
	"/*...*/".toRegex()
}

지연 초기화

class A {
	val b by lazy { B() }
	
	// ...
}

기본 자료형 사용하기