Java 链接列表插入绑定到插入的对象
我有如下代码:Java 链接列表插入绑定到插入的对象,java,linked-list,immutability,cloning,defensive-copy,Java,Linked List,Immutability,Cloning,Defensive Copy,我有如下代码: public class Polynomial { List<Term> term = new LinkedList<Term>(); public Term(Term term) { this.coefficient = term.coefficient; this.exponent = term.exponent; } 调用insert方法的代码: poly.insert(anotherTerm); poly.insert
public class Polynomial {
List<Term> term = new LinkedList<Term>();
public Term(Term term) {
this.coefficient = term.coefficient;
this.exponent = term.exponent;
}
调用insert方法的代码:
poly.insert(anotherTerm);
poly.insert((Term)anotherTerm.clone());
创建另一个术语的代码:
Term anotherTerm = new Term(3, 7.6); //sets coefficient and power to 3 and 7.6
调用insert方法的新代码:
poly.insert(anotherTerm);
poly.insert((Term)anotherTerm.clone());
不幸的是,由于
clone()在java.lang.Object中具有受保护的访问权限,所以它仍然不起作用,即使在执行之后,公共类Term实现了可克隆性{
问题也不是很清楚,但我只是尝试,在添加对象时,添加另一个Term.clone()问题不太清楚,但我只是尝试,当你添加对象时,添加另一个术语。克隆()听起来你不是在实例化新的对象,只是引用了同一个对象。你应该实例化一个新的术语,或者使用术语=新术语();
或者通过克隆术语
编辑要能够被克隆,术语
需要实现接口。这意味着您要负责如何定义术语
的新副本
如果看不到调用insert
方法的代码,很难判断,但听起来这就是问题所在。听起来好像您没有实例化新的对象,只是引用了同一个对象。您应该实例化一个新的术语,或者使用术语=新术语();
或通过克隆term.clone()
编辑要能够被克隆,术语
需要实现接口。这意味着您要负责如何定义术语
的新副本
如果没有看到调用insert
方法的代码,很难判断,但听起来这就是问题所在。好的,现在我对问题和行为有了更好的理解,用这个替换我的旧答案
如果愿意,您可以这样做:
public void insertTerm(Term term) {
polynomial.insert(new Term(term));
}
然后创建一个新的术语构造函数,如下所示:
public class Polynomial {
List<Term> term = new LinkedList<Term>();
public Term(Term term) {
this.coefficient = term.coefficient;
this.exponent = term.exponent;
}
那应该行。好的,现在我对问题和行为有了更好的理解,用这个取代我以前的答案
如果愿意,您可以这样做:
public void insertTerm(Term term) {
polynomial.insert(new Term(term));
}
然后创建一个新的术语构造函数,如下所示:
public class Polynomial {
List<Term> term = new LinkedList<Term>();
public Term(Term term) {
this.coefficient = term.coefficient;
this.exponent = term.exponent;
}
这应该行得通。解决方案很简单:使术语
不可变
有效Java第二版,第15项:最小化可变性:
- 不可变对象很简单
- 不可变对象可以自由共享
- 不可变对象为其他对象提供了很好的构建块
- 类应该是不可变的,除非有很好的理由使它们可变
- 如果一个类不能成为不可变的,那么就尽可能地限制它的可变性。
- 将每个字段设置为“最终”
,除非有令人信服的理由将其设置为“非最终”
像术语这样简单和小的东西实际上应该是不可变的。这是一个更好的总体设计,您不必担心您在问题中提出的问题
另见
由于其他答案建议您使用clone()
,此建议变得更加引人注目
有效Java第二版,第11项:明智地覆盖clone
由于有许多缺点,一些专家程序员干脆选择从不重写clone
方法,也从不调用它,除非复制数组
从:
如果你读过我书中有关克隆的内容,尤其是读过字里行间的内容,你就会知道我认为clone
已经彻底崩溃了
不要使术语实现可克隆
。改为使其不可变
另见
解决方案很简单:使
术语
不可变
有效Java第二版,第15项:最小化可变性:
- 不可变对象很简单
- 不可变对象可以自由共享
- 不可变对象为其他对象提供了很好的构建块
- 类应该是不可变的,除非有很好的理由使它们可变
- 如果一个类不能成为不可变的,那么就尽可能地限制它的可变性。
- 将每个字段设置为“最终”
,除非有令人信服的理由将其设置为“非最终”
像术语这样简单和小的东西实际上应该是不可变的。这是一个更好的总体设计,您不必担心您在问题中提出的问题
另见
由于其他答案建议您使用clone()
,此建议变得更加引人注目
有效Java第二版,第11项:明智地覆盖clone
由于有许多缺点,一些专家程序员干脆选择从不重写clone
方法,也从不调用它,除非复制数组
从:
如果你读过我书中有关克隆的内容,尤其是读过字里行间的内容,你就会知道我认为clone
已经彻底崩溃了
不要使术语实现可克隆
。改为使其不可变
另见
编辑:好的,我想我知道你现在在做什么了。如果你有这门课:
public class Polynomial
{
List<Term> term = new LinkedList<Term>();
public void insert(Term inserting)
{
term.add(inserting);
}
}
…那么对象术语是与poly.get(0)相同的对象。“术语”和“poly.get(0)”都是对同一对象的引用-更改一个会更改另一个。编辑:好的,我想我知道你现在在做什么了。如果你有这个类:
public class Polynomial
{
List<Term> term = new LinkedList<Term>();
public void insert(Term inserting)
{
term.add(inserting);
}
}
…那么对象术语是与poly.get(0)相同的对象。“术语”和“poly.get(0)”都是对同一对象的引用-更改其中一个会更改另一个。请在执行实例化和插入时发布代码。听起来很像您是