過去数ヶ月間、私は次のテクニック/パターンで数回つまずきました。しかし、特定の名前を見つけることはできないようです。また、その長所と短所を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と共にこの手法が使用されているのを見てきました。この点で、これもモジュール化に役立つようです。
それにもかかわらず、インターフェイスを実装の1つと結合するため、これがインターフェイスの誤用であるという感覚を揺るがすことはできません。(依存性反転の原理など。)誰もがこの技術がどのように呼ばれるか、そしてその長所と短所を私に説明してもらえますか?
更新:
しばらく検討した後、次のシングルトンバージョンのパターンがはるかに頻繁に使用されていることを再確認しました。このバージョンでは、パブリックの静的インスタンスは、(フィールドが最終であるために)1回だけ初期化されるインターフェイスを介して公開されます。さらに、インスタンスはほとんどの場合、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()