이펙티브 자바

참치돌고래·2021년 8월 29일
0

이펙티브 자바

목록 보기
1/21

1.생성자 대신 static 팩토리 메소드를 고려해보자

장점

- (1) 이름을 가질 수 있다.

public class Foo{
	String name;
    public Foo(String name){
##     	this.name = name;
        }
        
    public static Foo withName(String name){
    	return new Foo(name);
    	}
        
    public static void main(String[] args){
    
   	Foo foo1 = new Foo("Minsu");
       	// 위의 코드만 보고 판단하기 어렵다.
        
        Foo foo2 = Foo.withName("Minsu");
        
        
    	}
 }

- (2) 반드시 새로운 객체를 만들 필요가 없다.


public class Foo{
	String name;
    public Foo(){
    }
    private static final Foo MS = new Foo();
    
    public static Foo getFoo(){
    	return MS;
    }
    public static void main(String[] args){
    	Foo foo2 = Foo.getFoo();
        }
}

getFoo를 실행할 때마다 새로운 객체를 생성해서 반환하는 것이 아니라, 미리 생성해둔 객체를 반환한다.

- (3) 리턴 타입의 하위 타입의 인스턴스를 만들 수 있다.

public class Foo{
	public static Foo getFoo(boolean flag){
    		return ? new Foo() : new BarFoo();
    
    }


  static class BarFoo extends Foo{
      }


  public static void main(String[] args){

      Foo foo3 = Foo.getFoo(false);
  }
}

위의 getFoo는 flag의 값에 따라서 다른 타입의 객체를 반한시킨다.
타입은 하위 타입이어도 무방해진다.

- (4) 리턴하는 객체의 클래스가 입력 매개변수에 따라 매번 다르다.

enumSet의 경우 리턴하는 객체의 개수에 따라 RegularEnumSet 또는 JumboEnumSet으로 달라진다.

(5) 리턴하는 객체의 클래스가 public static 팩토리 메소드를 작성할 시점에 반드시 존재하지 않는다.

단점

- (1) publuc 또는 protected 생성자 없이 static public 메소드만 제공하는 클래스는 상속할 수 없다.

- (2) 프로그래머가 static 팩토리 메소드를 찾는게 어렵다.

생성자는 Javadoc 상단에 모아서 보여주지만 static 팩토리 메소드는 API 문서에서 다루어주지 않는다. 따라서 주석등으로 표시하는 것이 좋다.

profile
안녕하세요

0개의 댓글