我正在做一个JDK6项目。
我有一个pojo,像:
public class MyPojo implements serializable {
private List<Integer> ids;
public List<Integers> getIds() {
return ids;
}
public List<Integers> setIds(List<Integer> ids) {
// idsCopy = copy of ids; // how can I do it?
this.ids = idsCopy;
}
}
我想存储 setter 中传递的参数的副本,但我不想通过将引用声明为 List 接口的特定实现来将其专用化为方法签名:取决于 pojo 的使用位置,可以是 LinkedList 或 ArrayList 等。idssetIdids
我想保持参数的相同实现。ids
我该如何复制?
我想到的第一件事是:,但它需要被InstantiationException和TrastralleAccessException的try/catch块包围,特别是因为我不确定的实际实现是否有一个空的构造函数。有没有更直接的东西?ids.getClass().newInstance()ids
更新在这种情况下,最常见,最直接和最合理的事情是避免制作副本,并让谁将使用类MyPojo传递要设置的对象的副本,例如:
List<Integer> ls = new Arraylist<>();
MyPojo pj = new MyPojo();
pj.setIds(ls.clone()); // or using copy constructor or anything else..
一开始,我有这样的想法:
public <T extends List<Integer> & Cloneable> void setIds(T ids) {
this.ids = ids.clone();
}
强制使用一个类来实现也可以克隆,但可克隆接口的javadoc很好地解释了为什么这不起作用(以及为什么对克隆的反射也不会起作用):
类实现接口以向该方法指示该方法对该类的实例进行字段对字段复制是合法的。Cloneable
在未实现接口的实例上调用 Object 的 clone 方法会导致引发异常。CloneableCloneNotSupportedException
按照约定,实现此接口的类应使用公共方法重写 Object.clone(受保护)。有关重写此方法的详细信息,请参阅。
请注意,此接口不包含克隆方法。因此,仅凭它实现此接口这一事实就不可能克隆对象。即使以反射方式调用了 clone 方法,也不能保证它会成功。
最后,无论上下文如何,我问题的答案
有没有更直接的东西?
是“不”,很可能是因为不应该有做这件事的需要......即使。。
https://rules.sonarsource.com/java/type/Vulnerability/RSPEC-2384
互换的青春
慕村9548890
慕神8447489
月关宝盒
随时随地看视频慕课网APP
相关分类