java-squid / effective-java

effective java 3e study
105 stars 38 forks source link

[아이템 15] 클래스와 멤버의 접근 권한을 최소화하라 #15

Closed david215 closed 4 years ago

wooody92 commented 4 years ago

스크린샷 2020-11-02 오후 5 55 46

한 클래스에서만 사용하는 package-private 톱레벨 클래스나 인터페이스는 이를 사용하는 클래스 안에 private static으로 중첩시켜보자 (p.97 )

위 내용이 이해가 잘 안가는데 간단하게 설명 부탁드립니다..!

-> 핵심은 한 클래스에서 사용하는 일회성 이너 클래스는 접근제어자를 이용하여 외부에서 접근 불가하게 한다. (사이드 이펙트 방지)

102092 commented 4 years ago

p100 자바 9에서 모듈 시스템이라는 개념이 도입되면서...

간단하게나마 모듈 시스템에 무엇인지 공유해보면 좋을 것 같아요. 그리고 2가지 접근 수준이 추가되었다고 하는데,

... 모듈의 jar 파일을 자신의 모듈 경로가 아닌 애플리케이션..... 마치 모듈이 없는 것처럼 행동한다.

라는 말이 어떤 의미 인지 잘 감이 안 오네요. 모듈이 없는 것 처럼 행동한다는 말은, 모듈에서 제공하는 2가지 접근 수준이 적용되지 않는 다는 말일까요?

kses1010 commented 4 years ago

Q1

p99 public 가변 필드를 갖는 클래스는 일반적으로 스레드 안전하지 않다.

스레드 안전(thread 安全, 영어: thread safety)은 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻한다. 보다 엄밀하게는 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 올바로 나오는 것으로 정의한다.

스레드 안전하지 않다라는 뜻은 해당 필드가 여러 클라이언트 단에서 사용하여 위험하다는 뜻으로 해석하면 되나요?

Q2

p100

private static final Thing[] PRIVATE_VALUES = {...};
public static final Thing[] values() {
return PRIVATE_VALUES.clone();
}

여기서의 방어적 복사라는 건 Deep Copy라고 볼 수 있나요? 만약 그렇다면 성능상 좋질 않으니 첫번째 방법인 public 불변 리스트를 추가하는 편이 제일 좋은 방법일까요?

102092 commented 4 years ago

@kses1010

Q1

Q2

kses1010 commented 4 years ago

단순하게 list에 final을 붙이는 것이 아닌 Collections클래스의 unmodifiableList메서드를 사용하는 것 같아요.

david215 commented 4 years ago

@wooody92

한 클래스에서만 사용하는 package-private 톱레벨 클래스나 인터페이스는 이를 사용하는 클래스 안에 private static으로 중첩시켜보자 (p.97 )

한 클래스에서만 사용하는 클래스는 톱레벨 클래스일 필요가 없기 때문에 이를 사용하는 클래스 안에 nested class로 정의하면 된다는 뜻으로 보이네요.

102092 commented 4 years ago