一般的なコードで特定のセッターを呼び出したい。もちろん、私はケース・ステートメントに頼ることができますが、それは大きく成長するので、私はマップを好む。マップを使用してオブジェクト上のアクションを呼び出す方法
これは私がこれまでに思い付いたものです:
public class Tester {
private static final Map<String, Setter<Target, ?>> MY_SETTERS = new HashMap<>();
static {
MY_SETTERS.put("SOURCE1", (Target t, Source1 s) -> t.setSource1(s));
MY_SETTERS.put("SOURCE2", (Target t, Source2 s) -> t.setSource2(s));
}
@FunctionalInterface
private interface Setter<T, S> {
void set(T target, S source);
}
public static void main(String[] args) {
Target t = new Target();
MY_SETTERS.get("SOURCE1").set(t, new Source1());
}}
はしかし、これは私に、「互換性のない型を与える:CAP#1は、新鮮な型の変数ですソース1は、#1 をキャップに変換することはできません: CAP#1はオブジェクトをキャプチャから拡張しますか? "
なぜその失敗私は理解しています。しかし、ケースステートメントに頼ることなくこれを行うためのエレガントな方法はありますか?
は、それだけですべての 'セッター'を明示的にゲッターを書くために論外ですか?ですから、あなたは 'MY_SETTERS.getSource1Setter()。set(t、new Source1());'でちょうど立ち往生します。もちろん、これには欠点があります。これは、毎回あなたがどのセッターを扱っているかを正確に知る必要があります。 –
Obicere
@Obicere ..問題は、私の実際のcasusはJAXBが大量のエントリを持つ選択クラスを生成したことです。処理ステップの残りの部分が同じであるため、それらを汎用的に扱いたい。 – sjaak