✅이 붙은 텍스트는 본 내용과는 무관합니다.
Comment.of() 메서드는 Comment 객체 참조를 반환해주는데, 이런 메서드를 정적 팩터리 메서드라고 한다.
이름을 가질 수 있다.
BigInteger 클래스는 값이 소수인 BigInteger 클래스를 반환하는 probablePrime
메서드를 가지는데 probablePrime은 기본 생성자 BigInteger(int bitLength, Random rnd) 보다 더 반환될 객체의 특성을 제대로 설명할 수 있다.
호출될 때마다 인스턴스를 새로 생성하지 않을 수 있다.
클래스를 싱글턴으로 만듦으로써 인스턴스를 통제할 수 있다. 인스턴스 통제는 플라이 웨이트 패턴의 근간이 된다.
플라이웨이트 패턴(Flyweight pattern)
인스턴스를 가능한대로 공유시켜 new 연산자를 통한 메모리 낭비를 줄이는 방식.
https://lee1535.tistory.com/106
enum Animal {
dog, cat, bird;
}
class Main {
public static void main(String[] args) {
EnumSet<Animal> dog = EnumSet.of(Animal.dog, Animal.cat, Animal.bird);
}
}
✅ 자바 8이전에는 인터페이스가 정적 메서드를 가질 수 없었기 때문에 팩토리 메서드를 생성하기 위해서는 인스턴스화 불가 동반 클래스를 두어야 했지만 자바 8이후부터는 인터페이스가 정적 메서드를 가질 수 있게 되었기 때문에 다음과 같은 처리가 가능해졌다.
interface Animal { static Animal Animal(boolean isDog) { if (isDog) { return new Dog(); } return null; } } class Dog implements Animal { } class Main { public static void main(String[] args) { Animal animal = Animal.Animal(true); System.out.println(animal.getClass()); } }
정적 팩터리 메서드에 흔히 사용하는 명명 방식들
from: 매개변수를 하나 받아서 해당 타입의 인스턴스를 반환하는 메서드
of: 여러 매개변수를 받아 적합한 타입의 인스턴스를 반환하는 메서드
valueOf: from과 of의 더 자세한 버전
instance 혹은 getInstance: 매개변수를 받는다면 매개변수로 명시한 인스턴스를 반환하지만, 같은 인스턴스임을 보장하지는 않는다.
create 혹은 newInstance: instance 혹은 getInstance와 같지만, 매번 새로운 인스턴스를 생성해 반환함을 보장한다.
getType: getInstance와 같으나, 생성할 클래스가 아닌 다른 클래스에 팩터리 메서드를 정의할 때 쓴다. type은 팩터리 메서드가 반환할 객체의 타입
newType: newInstance와 같으나, 생성할 클래스가 아닌 다른 클래스에 팩터리 메서드를 정의할때 쓴다. type은 팩터리 메서드가 반환할 객체의 타입
type: getType과 newType의 간결한 버전