2009-04-01 5 views
1

にポリシーを渡すの代替として、私は次のようにいくつかのJavaコードがあります。のJavaのジェネリックは、コンストラクタ

public class Thing { 

    private IPolicy policy; 

    public Thing(IPolicy policy) { 
      this.policy = policy; 
    } 

    public void doSomething() { 
      this.policy.execute(); 
    } 
} 

私の質問です:それは、コンストラクタにポリシーを渡すのではなく、ジェネリック医薬品でこれを行うことは可能でしょうか?これは、私がそれが最終的なものになることを意味すると思います。

public class Thing<T extends IPolicy> 

しかし、私はジェネリックではありません。

私の動機は、1)私のプログラムがこのタイプの一部であり、コンストラクタ(他の関連するものがあります)に関与していないこと、そして2)ジェネリックを学ぶことを試みている。

+0

C++から来ていますか? (JavaのジェネリックはC++のテンプレートではありません。)Javaでは、一般的にbogの標準[動的]多型を使用して、パラメータ化された型を記述するための動作とジェネリックを記述します。この2つを組み合わせる必要があるかもしれませんが、C++はテンプレートだけで逃げるかもしれません。 –

答えて

3

私はそれが大変だとは思わない。方針のタイプだけではなく、あなたが依存しているポリシー自体ではありませんか?ポリシーに関する質問(アクションが許可されているかどうかなど)を聞きたいとは思わないのですか?つまり、ポリシーのインスタンスが必要です。つまり、コンストラクタに渡すのが理にかなっています。

ジェネリックスは、APIの一部が別のタイプに依存する厳密に型指定されたAPIが必要な場合に適していますが、実装自体はそのタイプが何か(潜在的にはいくつかの制約がある)を気にしません。コレクションAPIは、おそらく標準的な例です。List<T>は、Tが何であるかは気にしませんが、Tタイプので強いタイプのAPI を公開したいと考えています。私はあなたのポリシーの例にあてはまるとは思えません。

0

あなたがしようとしているのは、Thingに常にポリシーがあることを確認することです。ポリシーと一緒に存在することはできません。これは、Javaのジェネリックは型消去を使用しているためであっても、一般的なバージョンは、「コンストラクタにポリシーを渡して」避けられないだろう、などの

public abstract class Thing { 
    public abstract Policy getPolicy(); 
    public void doSomething() { 
     getPolicy().execute(); 
    } 
} 
0

を唯一のコンストラクタ機構や抽象化が必要です。ただし、GenericThing(Class<T> clazz)コンストラクタを実装することができますが、それはやり過ぎです:

public class GenericThing<T extends IPolicy> { 

    private T policy; 

    public GenericThing(Class<T> clazz) throws InstantiationException, IllegalAccessException { 
     policy = clazz.newInstance(); 
    } 

    public GenericThing(T policy) { 
     this.policy = policy; 
    } 

    public void doSomething() { 
     this.policy.execute(); 
    } 
} 

は、私は非常に多くのJonのanswerに同意します。あなたは実際にはが強く型付けされていることを利用していません

+0

なぜdownvote?私は間違ったことを悲しんだか?説明してください ... –

関連する問題