【问题标题】:`Arrays,copyOf` didn't do a deep copy of objects as it is supposed to`Arrays,copyOf` 没有像它应该做的那样做对象的深拷贝
【发布时间】:2013-05-14 08:51:22
【问题描述】:

我有 classBook,其中可以有很多 Authors。我将Author 类的几个对象传递给Book 类的构造函数,然后通过Arrays.copyOF 复制这些对象,但是如果我更改对象外部的任何Author 数据,它将随处更改,因此这意味着副本尚未已创建。

我想创建深拷贝。代码正在编译并运行,没有错误。

import java.util.Arrays;

public class Book {
    private String tytul;
    private int rokWydania;
    private Author[] autorzy;

    public Book(String tytul, int rokWydania, Author... autorzy) {
        this.tytul = tytul;
        this.rokWydania = rokWydania;
        this.autorzy = Arrays.copyOf(autorzy, autorzy.length);
    }

    public String toString() {
        String s = "      Tytuł: " + tytul +"\nrok wydania: " + rokWydania + "\n";
        if(autorzy.length == 1)
            s+="      Autor: " + autorzy[0];
        else{
            s+="    Autorzy: " + autorzy[0];
            for(int i = 1; i < autorzy.length; i++)
                s+="\n             " + autorzy[i];
        }       
        return s + "\n\n";
    }

    public static void main(String[] args) {
        Author a1 = new Author("Isabel", "Allende", 1942);
        Author a2 = new Author("Manueala", "Gretkowska", 1964);
        Author a3 = new Author("Piotr", "Pietucha", 1954);

        Book b1 = new Book("Suma naszych dni", 2010, a1);
        Book b2 = new Book("Polka", 2001, a2);
        Book b3 = new Book("Sceny z życia pozamałżeńskiego", 2003, a2, a3);

        a2.zmienInformacje("Tove", "Jansson", 1956);
        Book b4 = new Book("Lato muminków", 2006, a2);

        System.out.println(b1);

        System.out.println(b2);

        System.out.println(b3);

        System.out.println(b4);
    }
}

public class Author {
    private String imie, nazwisko;
    private int rokUrodzenia;

    public Author(String imie, String nazwisko, int rokUrodzenia) {
        this.imie = imie;
        this.nazwisko = nazwisko;
        this.rokUrodzenia = rokUrodzenia;
    }

    public String getImie() {
        return imie;
    }

    public String getNazwisko() {
        return nazwisko;
    }

    public int getRokUrodzenia() {
        return rokUrodzenia;
    }

    @Override
    public String toString() {
        return  imie + " " + nazwisko + " (ur. " + rokUrodzenia + ")";
    }

    public void zmienInformacje(String imie, String nazwisko, int rokUrodzenia) {
        this.imie = imie;
        this.nazwisko = nazwisko;
        this.rokUrodzenia = rokUrodzenia;

    }

}

期望的输出:

     Tytuł: Suma naszych dni
  rok wydania: 2010
        Autor: Isabel Allende (ur. 1942)


        Tytuł: Polka
  rok wydania: 2001
        Autor: Manuela Gretkowska (ur. 1964)


        Tytuł: Suma naszych dni
  rok wydania: 2010
      Autorzy: Manuela Gretkowska (ur. 1964)   
               Piotr Pietucha (ur. 1954)


        Tytuł: Lato muminków
  rok wydania: 2006
        Autor: Tove Jansson (ur. 1956)

我的输出

      Tytuł: Suma naszych dni
rok wydania: 2010
      Autor: Isabel Allende (ur. 1942)


      Tytuł: Polka
rok wydania: 2001
      Autor: Tove Jansson (ur. 1956)//WRONG


      Tytuł: Sceny z życia pozamałżeńskiego
rok wydania: 2003
    Autorzy: Tove Jansson (ur. 1956)//WRONG
             Piotr Pietucha (ur. 1954)


      Tytuł: Lato muminków
rok wydania: 2006
      Autor: Tove Jansson (ur. 1956)

【问题讨论】:

  • 它说它会去吗?可能不是。因此,更改标题以反映目标(并为其搜索) - 例如"创建一个数组的深层副本"
  • @user2246674 是的,确实有,关于它还有其他主题。
  • 不,it doesn't say it will make a deep copy关于这项任务的一个完整主题 - 其中有许多现有的答案/方法。 (例如12
  • @user2246674 但请不要在这里刻薄。在我的另一个主题中,有关于 valueOf 的完整讨论,这并不明显。谢谢。
  • 罗伯特,如果一个方法的 Javadoc 没有说它会执行深度复制,那么断言“它应该”这样做只是您的错误。再多的挥手或改变主题或提及未引用的其他主题都无法掩盖这一点。不是一个真正的问题。

标签: java deep-copy


【解决方案1】:

我认为Arrays.copyOf 工作正常。问题在a2.zmienInformacje("Tove", "Jansson", 1956); 行中,您在打印Book b2 and b3 之前正在更新Author a2

【讨论】:

  • 你是对的,但问题是我学生的老师没有正确理解agregation。她用composition 误解了它,尽管她无法正确实现其中任何一个,所以我必须“按照她的方式”做。
  • 你在回避这个问题。这里唯一可见的问题是您将属性归因于Arrays.copyOf(),而它没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多