1

使用する特定のデータ構造の実装を指定するパラメーターを取る必要があるアプリケーションを構築しています。たとえば、パラメーターのスーパータイプは Super であり、SubX として多くの実装が提供されています。私のアプリケーションのユーザーによって提供された、コンパイル時に知られていない SubY もあるかもしれません。

アプリケーション内では、パラメーターが渡され、Sub_ のインスタンスの作成、Super で定義されたメソッドの呼び出し、パラメーター化された型のパラメーターとして使用されます。

パラメーター化された型のみの場合は、クラスもパラメーター化することができ、それは機能します。ただし、そのようなオブジェクトのインスタンスを作成する必要があるため、アプリケーションを構成する最善の方法は何かを考えています。

タイプとファクトリーをパラメーターとして渡す必要がありますか? ファクトリ パターンは見苦しく、このアプローチは避けたいと思います。その上、あまりにも多くのパラメーターが渡されます (私のアプリケーションでは実際にそのようなパラメーターがいくつか必要です)。

オブジェクトを作成して、この構成をそこに貼り付ける必要がありますか? オブジェクト object を実行時に解決して、コンパイル時に構成を認識できないようにすることはできますか?

編集:理想的には、次のコードのようなものが欲しいです。これに基づいて最小限の実用的な例を提供できますか?

class Test[Type <: Super] { 
   def main {
       val testVal: Type = new Type()
       testVal.methodDefinedInSuper()
    }
 }
4

2 に答える 2

2

ファクトリを使用します。それらが多すぎて、それらを統合するためにファクトリのファクトリを作成したくない場合は、依存性注入フレームワークを使用してください。依存性注入フレームワークは、XML 構成もサポートしています。これは、やりたいことと一致しているようです。

依存性注入フレームワークをまったく知らない場合は、まず、使用しているフレームワークがまだそれを提供していないかどうかを確認し、そうでない場合はGoogle Guiceを調べてください。

工場での例:

trait Factory[T] {
  def newInstance(): T
}

class Test[Type <: Super](typeFactory: Factory[Type]) { 
  def main {
     val testVal: Type = typeFactory.newInstance()
     testVal.methodDefinedInSuper()
  }
}

Google GUICE の例:

class Test[Type <: Super] { 
  @Inject val testVal: Type = _
  def main {
     testVal.methodDefinedInSuper()
  }
}

Google Guice でのこのスタイルのインジェクションは、すべての中で最も推奨されていないことに注意してください。一般的な見方をするのに最も簡潔でもあるので、私はそれを使用しました。

ただし、Type <: Superどちらの場合でも使用する理由はないことに注意してください。そのバウンドでは何も得られないため、次のように書き換えることができます。

class Test(typeFactory: Factory[Super]) { 
  def main {
     val testVal: Super = typeFactory.newInstance()
     testVal.methodDefinedInSuper()
  }
}

class Test { 
  @Inject val testVal: Super = _
  def main {
     testVal.methodDefinedInSuper()
  }
}

とにかく、最初のケースではファクトリをコンストラクターのパラメーターとして渡し、2 番目のケースでは、Guices バインディングの 1 つを使用して、初期化に何を使用する必要があるかを Guice に伝えますtestVal

于 2012-07-03T16:00:52.633 に答える
1

型パラメーターを使用してオブジェクトを渡し、型パラメーターに基づいて異なる動作を期待することは機能しません。これらのパラメーターは、型消去のためにコンパイル時にのみ存在するためです。

(わかりました、わかりました、間もなく非推奨になるマニフェスト、またはおそらく 2.10 の新しい型タグを使用できますが、日常のアプリケーション コードではそのようなブードゥー教は避けるべきです。)

于 2012-07-03T15:35:49.323 に答える