0

複数のフィールド (int、String など) だけでなく、HashMap と ArrayList を含むオブジェクトがあります。このオブジェクトは、後でデータベース クエリを作成するために使用されるパラメーターを保持しますが、ArrayList 内の異なるアイテムを除いて、追加のクエリに対してまったく同じパラメーターをすべて再利用する必要がある場合があります。

配列リストの内容を変更すると、常に元のオブジェクトが変更されることに気付きました。clone() メソッドをオーバーライドして浅いコピーを作成する方法を理解しましたが、配列リストは常にオブジェクトのコピーによって共有されたままです。ディープ コピーなどに飛び込む前に、それが最善の方法かどうかについてアドバイスが必要だと思います。

複製する方法を見つける必要があるオブジェクトの例を次に示します。

public class QueryParameters implements Cloneable {

    protected HashMap<String,String> foundArgs = new HashMap<String,String>();
    protected ArrayList<ActionType> action_types = new ArrayList<ActionType>();

    protected String lookup_type = "lookup";
    protected Location loc;
    protected Vector player_location;
    protected int id = 0;
    protected int radius;
    protected boolean allow_no_radius = false;
    protected String player;
    protected String world;
    protected String time;
    protected String entity;
    protected String block;
    // ... lots of getters/setters
}

私はいつでも新しいインスタンスを作成し、ゲッター/セッターを使用してデータを転送することができますが、それは私には冗長すぎるように感じます.コピーしなければならない約15のフィールドがあり、新しいフィールドを追加する場合は覚えておく必要があります.それらをここに追加します。

action_types変更が元のオブジェクトに影響を与えないように、新しいインスタンス/クローンを取得するための最良の方法は何ですか?

4

2 に答える 2

3

「独自のクラスを複製する」場合は、ゲッターとセッターを使用する必要はありません。多分このようなコンストラクタ?

private QueryParameter(QueryParameter other)
{
    foundArgs = new HashMap<String, String>(other.foundArgs);
    action_types = new ArrayList<ActionType>(other.action_types);
    // etc
}

// As a static method, or
public static QueryParameter copyOf(QueryParameter other)
{
    return new QueryParameter(other);
}

// as an instance method
public QueryParameter copy()
{
    return new QueryParameter(this);
}

これは多くの解決策の1つです...

于 2013-01-05T18:05:43.777 に答える