私はこれを設計する良い方法についていくつかの情報を得ることができるのだろうかと思います。私は私のアプローチをしますが、私はよりよい解決策があると思います(したがって質問:))。デザインヘルプ!列挙型の工場変圧器のJavaジェネリックス!
あるオブジェクトを別のオブジェクトから作成するためのアクセサを持つ列挙型(オプションをクリアし、シングルトンアーキテクチャを避けるため)を作成します。しかし、これらのオブジェクトはかなり柔軟です。
この変換のオプション数を制限する方法と考えてください。
私は少しの階層に行きましょう。
public enum ValueTransformer{
VALUE_A{
@Override
public <T> T createVo (Class<T> expectedRtn, Object obj) {
ValueA retObj = null;
if (expectedRtn == getReturnType()) {
if (obj != null && CanBeTranslatedToA.class == obj.getClass()) {
retObj = new ValueA();
/*...*/
}
}
return retObj;
}
@Override
public Class<ValueA> getReturnType() { return ValueA.class; }
},
VALUE_B {
@Override
public Class<ValueB> getReturnType() { return ValueB.class; }
@Override
public <T> T createVo (Class<T> expectedRtn, Object obj) {
ValueB retObj = null;
if (expectedRtn == getReturnType()) {
if (obj != null && CanBeTranslatedToB.class == obj.getClass()) {
retObj = new ValueB();
/*...*/
} else if (obj != null && AnotherClassForB.class = obj.getClass()){
retObj = new ValueB();
/* ... */
}
}
return retObj;
}
};
public abstract <T> Class<T> getReturnType();
public abstract <T> T createVo (Class<T> expectedRtn, Object obj);
}
これはまともなデザインです:私はこのような何かをやって考えていた
class Base {...}
class ValueA extends Base {...}
class ValueB extends Base {...}
:私はこのような何かにオブジェクトの多様なセットからつもりですか?この列挙型はおそらく成長し、ValueAとValueBの作成元は変わる可能性があります(sysが成長すると)。私はこれらすべてのケースで「ベース」を返すことができますが、キャストと小切手が必要になります。私はそれを持っていないことを好むだろう。
私にはexpectedRtnパラメータが必要ですか?ジェネリックスをまったく使用すべきですか?私はかなりJavaに新しいので、私は常にこのケースを処理するための最善の方法ではないと思います。
ヒントありがとうございます。
これらの列挙値がどのように使用されるかのコード例を挙げることはできますか?申し訳ありませんが、これはオーバーエンジニアリングのように見えます。 – StriplingWarrior
呼び出し元は "期待される戻り値の型"を知る必要があるので、彼はそれをキャストするかもしれません。 – mhaller
キャストを行う方がよいでしょうか?私はキャスティングが大きなノーノだと思った。ちょっと危険な。 私は簡単に間違っている可能性があります。このようにすると、デベロッパーは自分のしていることをまだ知っていなければなりませんが、間違っているかどうかを知ることはできません。間違ったキャストを強制することは可能でしょうか? – rybit