ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 이펙티브 자바 - ITEM1
    ⏰ 오늘의 공부/Java 2022. 1. 5. 01:17

    Constructor 대신 Static Factory Method 를 고려하라

    Constructor

    public static class Laptop {
        private String model;
        private String company;
    
        public Laptop(String model, String company) {
            this.company = company;
            this.model = model;
        }
    }

    Static Factory Method = 객체 생성의 역할을 하는 메서드

    public static class Laptop {
        private String model;
        private String company;
    }
    
    // 네이밍 룰 
    // from~ = 매개변수 하나인 메서드
    // of~ = 매개변수가 N개인 메서드
    public static Laptop ofModelNameAndCompany(String modelName, String company) {
        Laptop laptop = new Laptop();
        laptop.company = company;
        laptop.model = modelName;
        return laptop;
    }

     

    왜 Static Factory Method를 써야하는가 ?

    • 이름을 가질 수 있다.
      • 정적 팩토리 메서드를 사용하면 메서드 이름에 객체의 생성 목적을 담아 낼 수 있다.
      • 객체는 생성 목적과 과정에 따라 생성자를 구별해서 사용할 필요가 있다.

    • 호출할 때마다 새로운 객체를 생성할 필요가 없다.
      • 불편 클래스의 경우 인스턴스를 미리 만들어 놓거나 새로 생성한 인스턴스를 캐싱하여 불필요한 객체 생성을 피한다.
      • 정적 팩토리 메소드를 사용하면 언제 어느 인스턴스를 살아 있게 할지 통제할 수 있다.
        • 클래스를 싱글톤으로 만들 수 있다.
        • 인스턴스화 불가로 만들 수 있다.
        • 불변 값 클래스에서 레퍼런스 값이 같음을 보장할 수 있다. (a == b)

      • 인스턴스 통제는 플라이웨이트 패턴의 근간이 됨


        참고: 플라이웨이트 패턴 ?
        데이터를 공유하여 메모리를 절약하는 패턴
        공통으로 사용되는 객체는 한번만 사용되고 Pool에 의해서 관리, 사용된다.

    • 하위 자료형 객체를 반환할 수 있다.
      • 하위 자료형 객체를 반환하는 정적 팩토리 메서드의 특징은 상속을 사용할 때 확인할 수 있다.
      • 생성자의 역할을 하는 정적 팩토리 메서드가 반환값을 가지고 있기 때문에 가능한 특징
        ex) BasicIntermediateAdvanced 클래스가 Level라는 상위 클래스를 상속받고 있는 구조일 때
        public class Level {
          ... 
          public static Level of(int score) {
            if (score < 50) return new Basic();
            else if (score < 80) return new Intermediate();
            else return new Advanced();
          }
          ...
        }
    • 객체 생성을 캡슐화할 수 있다.
      • ex) API request 를 가정
        public static class LaptopForm {
            private String model;
            private String company;
        }
        @PostMapping(value = "/add")
        public LaptopDto addLaptop(@RequestBody LaptopFrom laptopFrom) {
        	  
        }
        public static class Laptop {
            private Long id;
            private String model;
            private String company;
        }
        
        public static Laptop from(LaptopForm laptopForm) {
            Laptop laptop = new Laptop();
            laptop.company = laptopForm.getCompany();
            laptop.model = laptopForm.getModel();
            return laptop;
        }
         
        정적 팩토리 메서드를 사용하여 내부 구현을 모르더라도 DTO  Entity를 쉽게 변환할 수 있다.
        Laptop laptop = Laptop.from(laptopForm); // 정적 팩토리 메서드를 쓴 경우
        Laptop laptop = new Laptop(laptopForm.getModel(), laptopForm.getCompany()); // 생성자를 쓴 경우

    • 실제 구현체 클래스가 없어도 된다.

    '⏰ 오늘의 공부 > Java' 카테고리의 다른 글

    이펙티브 자바 - ITEM2  (0) 2022.01.05

    댓글

Designed by Tistory.