Final

상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 - [4장. 클래스와 인터페이스(아이템19)]
상속을 고려해 설계하고 문서화하는 방법들을 알아보자. 1. 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지(자기 사용) 문서로 남겨야 한다. 🛺 재정의 가능 메서드를 호출할 수 있는 모든 상황을 문서로 남겨야 한다. 유명한 격언 중 하나인 "좋은 API 문서란 '어떻게'가 아닌 '무엇'을 하는지를 설명해야 한다"와 대치되는 내용이기도 하다. 하지만 상속이 캡슐화를 해치기 때문에 클래스를 안전하게 상속할 수 있도록 하려면 '상속만 아니었다면 기술하지 않았어야 할' 내부 구현 방식을 설명해야 한다. AbstractCollection.java의 remove 메서드를 살펴보자. 위와 같이 API 문서의 메서드 설명 끝에 "Implementation Requirements"가 붙은 걸 볼..

변경 가능성을 최소화하라(불변 클래스를 만들 때 고려할 것)(3) - [4장. 클래스와 인터페이스(아이템17)]
이전 글 변경 가능성을 최소화하라(불변 클래스를 만드는 다섯 가지 규칙)(1) - [4장. 클래스와 인터페이스(아이템17)] 변경 가능성을 최소화하라(불변 클래스의 장점, 단점, 단점 대처 방법)(2) - [4장. 클래스와 인터페이스(아이템17)] 이번 글에서는 '불변 클래스를 만들 때 고려할 것'에 대해서 알아보자. 1. 상속을 막을 수 있는 또 다른 방법 🦓 이전 글을 통해 불변 클래스를 보장하려면 자신을 상속하지 못하게 해야 한다는 것을 알 수 있었다. 자신을 상속하지 못하게 하는 가장 쉬운 방법으로 final 클래스에 대해서 알아보았다. 하지만 더 유연한 방법이 있다. 모든 생성자를 private 혹은 package-private으로 만들고 public 정적 팩터리를 제공하는 방법이다. // 1...

변경 가능성을 최소화하라(불변 클래스를 만드는 다섯 가지 규칙)(1) - [4장. 클래스와 인터페이스(아이템17)]
불변 클래스란 인스턴스의 내부 값을 수정할 수 없는 클래스를 말한다. 불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴는 순간까지 절대 달라지지 않는다. 불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다는 이점이 있다. 아이템 17에서는 아래 3가지 내용을 다루고 있다. 불변 클래스를 만드는 다섯 가지 규칙 불변 클래스의 장점, 단점, 단점 대처 방법 불변 클래스를 만들 때 고려할 것 이번 글에서는 '1. 불변 클래스를 만드는 다섯 가지 규칙'에 대해서 알아보자. 1. 객체의 상태를 변경하는 메서드를 제공하지 않는다. 🚕 public class PhoneNumber { private short areaCode, prefix, lineNum; pub..

생성자 주입을 선택하라!
이전 글을 통해 의존관계를 주입하는 4가지 방법(생성자 주입, 수정자 주입, 필드 주입, 일반 메서드 주입)을 살펴보았다. 이번 글에서는 4가지 방법 중 생성자 주입을 사용해야 하는 이유에 대해서 알아보고자 한다. 3가지 이유(불변, 누락 방지, final 키워드 사용 가능)를 근거로 생성자 주입을 사용해야 하는 이유를 알아보자. (들어가기에 앞서 생성자 주입이란 생성자를 통해서 의존 관계를 주입하는 방법이다.) @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Aut..