2017-04-02 11 views
1

私は、そのAPIがゲッターメソッドだけであるインターフェイスを持っているため、インターフェイスを実装するクラスがその点で不変であることが保証されています。
しかし、インターフェイスの動作を変更するものを更新する必要がある場合、具体的なクラスの新しいインスタンスを作成するようにインターフェイスを宣言する方法はありますか?私は明確にするための引数を省略している強制的にインターフェイス宣言でインスタンスを作成する

public interface Generator { 
     public int[] values(); 
     public float[] indications(); 
     //etc 
     public MyEnum type; 
    } 

    public class ConcreteClass implements Generator { 
     private ConcreteClass() { 
     } 
     public static ConcreteClass createInstance() { 

     } 
    }  


は今、私のようなものを持っています。
createInstanceをインターフェイスに移動するにはどうすればよいですか?

答えて

0

インターフェイスは実装されていません。 Java 8では、デフォルトのメソッドを持つことができますが、インターフェイスが実装クラスを知っていることは悪い考えです。インタフェースは抽象的なままで、そのサブクラスを知らなくてはなりません。

ConcreteClassが不変の場合は、それを文書化して、副作用のある各メソッドが現在のオブジェクトに変更を適用せず、代わりにConcreteClassの新しいインスタンスを作成するようにする必要があります。例えば

あなたはvaluesフィールドを更新するための方法を提供したいと、あなたはConcreteClassにこの方法を提供することができ:

public ConcreteClass withValues(int[] values){ 
    // copy all existing properties from the original to the copy but values 
    ConcreteClass copy = new ConcreteClass(values, this.indications, this.type);  
    return copy; 
} 

あなたが本当にConcreteClassからインスタンスの作成を動かしたい場合は、そのファクトリを作成することができますこのサービスを提供します。

+0

私は 'createInstance()'をインタフェース宣言の一部として良い設計アプローチにするかどうか検討していました。私はメソッドのみを定義し、実際の実装は定義しません。 – Jim

+0

インタフェースに抽象メソッドを追加して新しいインスタンスを作成することは、インターフェイスが制約の実装(必須フィールドなど)を認識していることを前提としており、実装へのインタフェース逆しか真実でなければなりません。 – davidxxx

+0

それからインタフェースが、不変なものを定義していて、正しくないものを定義しているとしたら?私はセッターを追加するかどうかは関係ありませんか? – Jim

関連する問題