2016-11-25 7 views
3

私はabstract class Fooを持っていますが、これには関数a(Object o)が含まれています。
Fooの実装に応じて、a(Object o)はわずかに異なります。ユーザがどのクラスを初期化するかを選択できるようにする方法

私はプログラムのユーザーが使用されているFooのどのような実装を決定することができるようにしたい(例えば、aFoobFoocFoo、など)が、私はそのよう条件ロジックの私の使用を削減したいです私のプログラムに将来安全に追加することができます。

私は現在Fooのすべての実装の名前を保持するEnum eBarを持っていますが、これはユーザが選択できますが、そのクラスを初期化する方法を決定することはできません。

+1

ベースオブジェクトを作成します。あなたの他のオブジェクトのそれぞれは、ベースオブジェクトから継承する必要があります。基本オブジェクトクラスのすべての操作を行い、どのクラスが使用されているかを確認する必要がある場合は、instanceof javaキーワードで確認してください。 – Rafal

答えて

4

ストアを使用、または各列挙型のインスタンスでは、使用するためにはFooを作成する方法を追加するためのFooのインスタンス:

public enum FooType { 
    A { 
     @Override 
     public Foo createFoo() { 
      return new AFoo(); 
     } 
    }, 
    B { 
     @Override 
     public Foo createFoo() { 
      return new BFoo(); 
     } 
    } 

    public abstract Foo createFoo(); 
} 

そして、ユーザはタイプを選択した後、すべてを行う必要があります

selectedFooType.createFoo().a(object); 
+0

これは私が必要としてくれたすべてのものです。 – irishMTS

+0

@irishMTSこの回答があなたの問題を解決した場合は、それを正しい回答としてマークしてください(回答の横のチェックマークをクリックしてください)。スタックのオーバーフローに関するすべての投稿は、将来の訪問者にとって有用であると考えられており、受け入れられた回答を持つ質問がより役に立ちそうです。 – progyammer

+0

チップ@progy_rockをありがとう、しかし私はStackOverflowが私に答えを受け入れる前にしばらく待たなければなりませんでした。さもなければ私はすぐにそうしました。 – irishMTS

3

[EDITは]あなたがEnum

以下のような
public enum FooType { 

     FOO_A(aFoo::new), 
     FOO_B(bFoo::new), 
     FOO_C(cFoo::new); 
     //add as much as you want here 

     private final Supplier<Foo> fooSupp; //the aim of using a supplier is to create a new instance each time you call the create method as mentioned in the comment. 

     FooType(final Supplier<Foo> fooSupp) { 
      this.fooSupp = fooSupp; 
     } 

     public final Foo create(){ 
     return this.fooSupp.get(); 
     } 
} 
を使用していることを行うことができます

次にこのように使用できます

final Foo myFoo = FooType.FOO_A.create(); 
myFoo.o(Object); 
+0

これは素晴らしいことですが、@ JB Nizetの回答はちょっと分かりやすいと思います。しかし、ありがとう。 – irishMTS

+0

このように、 'create()'関数は新しいオブジェクトを作成せず、すべての呼び出しで同じオブジェクトだけを返します。 'Supplier 'と 'FOO_A(aFoo :: new)'を使う方が良いでしょう。 – glglgl

+0

私は自分の答えを作って編集して、彼がそのJava 8の機能( 'Supplier')を使うことを願っています。 – Mitchapp

関連する問題