0

オブジェクトの特定のプロパティを新しいものに置き換える必要があります。それを行う最良の方法は何ですか?将来、さらにプロパティを追加しても、どこにも壊れないはずです。プロパティごとに設定するメソッドを作成できますが、オブジェクトに新しいプロパティを追加するたびに、このメソッドを変更する必要があります。それを行う最良の方法はありますか?

物体

public class TangoObject {

  String a;
  String b;
 // so on
public void update(TangoObject to){
  setA(to.getA());
  setB(to.getB());
   }
}

以下のコードを実行すると

 SomeService(TangoObject to){
   //call processor
    someObject.processor(to);
    doSomethingelse(to);
  }

プロセッサー・コード

class SomeObject {
   public void processor(TangoObject to) {
     TangoObject newTo = new TangoObject();

     // manipulate the new object to
      tangoObject.update(newTo); -- replacing original tangoObject with new one as some properties where changed
   }
 }
4

3 に答える 3

1

あなたのアプローチに問題はありません。すべてがシンプルで読みやすく保たれ、新しいプロパティを追加するときにメソッドを 1 つ変更するだけで済みます。

于 2013-06-04T19:54:46.773 に答える
0

だからあなたはその方法が好きではありません:

public void update(TangoObject to){
  setA(to.getA());
  setB(to.getB());
}

TangoObjectクラスに新しいプロパティを追加するたびに維持する必要があるためです。

ある TangoObject から別の TangoObject にプロパティをコピーするより動的な方法を使用することで、これを回避できます。beauUtilsを使用してプロパティをコピーできます。したがって、メソッドは次のようになります。

public void update(TangoObject to){
  BeanUtils.copyProperties(to, this);
}

TangoObjectまた、クラスにプロパティを追加するときに、それを維持する必要はありません。

編集:依存関係に BeanUtils を含めたくない場合は、リフレクションを使用してこの機能を実装できます。TangoObjectですべてのフィールドを取得できるため、継承しない場合はケースが簡単になりますclass.getDeclaredFelds()。次のようなことができます:

static <T> void copy(T from, T to) throws IllegalArgumentException, IllegalAccessException {
    Class<?> clazz = from.getClass();
    Field[] fields = clazz.getDeclaredFields();
    for (int i = 0; i < fields.length; i++) {
        fields[i].setAccessible(true);
        Object value = fields[i].get(from);
        fields[i].set(to, value);
    }
}

実際には、インスタンスを置き換えるのではなく、その状態、つまりフィールドの値だけを置き換えます。インスタンスtoは同じままですが、別のオブジェクトの状態は、そのプロパティをコピーすることによって転送されます。

于 2013-06-04T19:55:49.493 に答える
0

コピー コンストラクターを作成することもできますが、同じ制限があります。コピーせずにフィールドを追加する方法はありません。

すべてのセッターとゲッターを持つ構造が好きで、「Pojo」を使用するすべてのコードがそれを許可する場合、使用できない理由はまったくありません。

public class TangoObject {
    HashMap vars=new HashMap();

    パブリック文字列 getA() {
        return (文字列) (vars.get("a"));
    }

    public void setA(String a) {
        vars.put("a",a);
    }

    public int getB() {
        整数 i=vars.get("b");
        return (int) (i == null ? 0 : i);
    }
  ...

    public void update(TangoObject to){
        to.vars.clear();
        to.vars.copyFrom(vars);
    }
}

これがこれまでで最高のものだと言っているわけではありませんが、クラスが単なる Bean クラスである場合 (変数を取得して取得する以外に変数を使用することはありません)、個別の変数を使用することよりも大きな利点はありません。「型の安全性」はセッターとゲッターによって保証されるため、他のソリューションよりも悪くありません。

個人的に豆柄は大嫌いです。私は、setter と getter がまったくない pojo を好みます。つまり、pojo にはビジネス ロジックが内部にあり、使用される場所でコード全体に勝手に広がることはありません。クラスにロジックがない場合、それはクラスであってはなりません。しかし、これは一般的な見解ではありません。実際、このように感じているのは私だけかもしれません。

于 2013-06-04T20:38:44.823 に答える