지난 몇 달 동안 나는 다음과 같은 기술 / 패턴에 대해 몇 번 걸려 넘어졌습니다. 그러나 특정 이름을 찾을 수 없으며 모든 장점과 단점에 대해 100 % 확신 할 수 없습니다.
패턴은 다음과 같습니다.
Java 인터페이스 내에서 일반적인 방법 세트는 평소와 같이 정의됩니다. 그러나 내부 클래스를 사용하면 인터페이스를 통해 기본 인스턴스가 누출됩니다.
public interface Vehicle {
public void accelerate();
public void decelerate();
public static class Default {
public static Vehicle getInstance() {
return new Car(); // or use Spring to retrieve an instance
}
}
}
나를 위해, 가장 큰 장점은 개발자가 인터페이스를 알아야하고 구현이 아닌 인터페이스에 대해서만 알아야한다는 것입니다. 예를 들어 인스턴스를 신속하게 생성하려는 경우.
Vehicle someVehicle = Vehicle.Default.getInstance();
someVehicle.accelerate();
또한 구성에 따라 인스턴스를 동적으로 제공하기 위해이 기술이 Spring과 함께 사용되는 것을 보았습니다. 이와 관련하여 모듈화에 도움이 될 수도 있습니다.
그럼에도 불구하고 인터페이스가 구현 중 하나와 연결되어 있기 때문에 이것이 인터페이스의 오용이라는 느낌을 떨칠 수 없습니다. (종속성 역전 원리 등) 누구든지이 기술의 장점과 단점뿐만 아니라이 기술이 어떻게 호출되는지 설명해 주시겠습니까?
최신 정보:
고려할 시간이 지난 후, 나는 다음 싱글 톤 버전의 패턴이 훨씬 더 자주 사용되었음을 다시 확인하고 알아 차렸다. 이 버전에서 공개 정적 인스턴스는 인터페이스가 마지막으로 필드가 한 번만 초기화되는 인터페이스를 통해 노출됩니다. 또한 인스턴스는 거의 항상 Spring 또는 일반 팩토리를 사용하여 검색하여 인터페이스를 구현에서 분리합니다.
public interface Vehicle {
public void accelerate();
public void decelerate();
public static class Default {
public static final Vehicle INSTANCE = getInstance();
private static Vehicle getInstance() {
return new Car(); // or use Spring/factory here
}
}
}
// Which allows to retrieve a singleton instance using...
Vehicle someVehicle = Vehicle.Default.INSTANCE;
간단히 말해서 이것은 사용자 정의 싱글 톤 / 팩토리 패턴 인 것으로 보입니다.이 패턴은 기본적으로 인터페이스를 통해 인스턴스 또는 싱글 톤을 노출시킬 수 있습니다. 단점과 관련하여 아래 답변 및 의견에 몇 가지 이름이 지정되었습니다. 지금까지의 장점은 편의성에있는 것 같습니다.
Vehicle.Default
예를 들어, 팩토리 클래스와 같은 패키지 이름 공간들로 이동해야합니다 VehicleFactory
.
Vehicle.Default.getInstance() != Vehicle.Default.getInstance()