私は次のようなひらめきを持っています:
~interface Car
~ abstract class SportsCar
~ class Ferrari
FerrariFactoryを使用してクラスFerrariのインスタンスを作成します(モジュールのコードを以下に示します)。
install(new FactoryModuleBuilder().build(FerrariFactory.class));
FerrariFactoryインターフェースには、アシストインジェクトを使用してパーツを注入する次のメソッドがあります(これは、すべてのパーツ、つまりフェラーリ固有のパーツ+スポーツカーパーツを含むxml要素です)。
Ferrari create(@Assisted Element partsElement);
フェラーリインスタンスを作成するとき、私は以下を使用しています:
ferrariFactory.create(partsElement);
フェラーリコンストラクターが最初に呼び出されます。
@Inject
public Ferrari(Element parts) {
super(parts);
this.ferrariRadio= getElementValue(parts, "Parts/FerrariParts/ferrariRadio");
}
最初の行はSportsCarのスーパークラスコンストラクターの呼び出しであるため、次のようになります。
public SportsCar (Element parts) {
super();
System.out.println("SportsCarconstructor: 1");
System.out.println("SportsCarconstructor: 2 "+parts);
...
... // where I set the basic parts from the parts xml element
}
SportsCarは抽象であるため、guiceモジュールには拘束力がありません。バインドする方法がわかりません。また、null経由で何にもアクセスしていないのに(nullポインターの奇妙なケース)、SportsCarコンストラクターの2番目のsysout行でNullPointerExceptionが発生します。
それがバインディングの問題であるかどうか、または私のabstractclassコンストラクターがパーツを設定できない理由についての提案はありますか?
OK。答えが見つかりました。私は2つのことを見逃していました:
1. Ferrariコンストラクターで@Assistedアノテーションを見逃しました:
@Inject
public Ferrari(@Assisted Element parts) {
super(parts);
....
}
2.次のようにモジュールで抽象クラスと実装を宣言できます。
install(new FactoryModuleBuilder().implement(SportsCar.class,Ferrari.class).build(FerrariFactory.class));
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加