0

我有一个对象,它包含几个字段(整数、字符串等),还有一个 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
}

我总是可以创建一个新实例并使用 getter/setter 来传输数据,但这对我来说太冗长了——我必须复制大约 15 个字段,如果我添加新的字段,我需要记住在此处添加它们。

我获得新实例/克隆的最佳方法是什么,以便更改action_types不会影响原始对象

4

2 回答 2

3

如果您“克隆自己的类”,则不需要使用 getter 和 setter。像这样的构造函数可能吗?

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);
}

这是众多解决方案中的一种...

于 2013-01-05T18:05:43.777 回答
0

我建议编写一个克隆方法,使用 super.clone() 复制大部分字段,然后替换克隆中的 ArrayList。像这样的东西:

import java.util.ArrayList;

public class QueryParameters implements Cloneable {
  @Override
  public String toString() {
    return "QueryParameters [action_types=" + action_types + ", otherData="
        + otherData + "]";
  }

  protected ArrayList<String> action_types = new ArrayList<String>();
  protected String otherData;

  @Override
  public QueryParameters clone() throws CloneNotSupportedException {
    QueryParameters cloned = (QueryParameters) super.clone();
    cloned.action_types = new ArrayList<String>(action_types);
    return cloned;
  }

  public static void main(String[] args) throws CloneNotSupportedException {
    QueryParameters test = new QueryParameters();
    test.otherData = "a field";
    test.action_types.add("xyzzy");
    test.action_types.add("abcde");
    System.out.println("Original: " + test);
    QueryParameters clone = test.clone();
    clone.action_types.add("A new action type");
    System.out.println("Modified clone: " + clone);
    System.out.println("Original after clone modification: " + test);
  }
}
于 2013-01-05T18:29:03.900 回答