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)”都是对同一对象的引用-更改其中一个会更改另一个。

请在执行实例化和插入时发布代码。听起来很像您是