코드

생성자

Keyword의 생성자는 private 이며, 이 생성자는 intern 메소드에서만 호출한다.

Clojure 1.11.1 clojure.lang.Keyword

private Keyword(Symbol sym){
    this.sym = sym;
    hasheq = sym.hasheq() + 0x9e3779b9;
}

hasheq 필드에 sym.hasheq()0x9e3779b9를 더한 값이 들어간다는 것에 주목.

hasheq

Clojure 1.11.1 clojure.lang.Keyword.hashCode

public final int hashCode(){
    return sym.hashCode() + 0x9e3779b9;
}

public int hasheq() {
    return hasheq;
}

Java 코드에서는 hashCode가 있지만, Clojure에서 판별하는 해시값은 hasheq를 사용하므로 Clojure의 Keyword는 생성될 때 캐싱된 해시값을 그대로 사용하는 셈이다.