2013-05-19 1 views
-2

클래스 Book에 많은 Authors을 가질 수 있습니다. 클래스 Author 클래스의 몇 가지 객체를 Book 클래스의 생성자에 전달한 다음이 객체를 Arrays.copyOF으로 복사하지만 객체 외부의 Author 데이터가 변경되면 모든 부분이 변경되어 복사본이 만들어지지 않았 음을 의미합니다.`어레이, copyOf`는 객체의 딥 복사를 수행하지 않았습니다.

깊은 사본을 만들고 싶습니다. 코드가 컴파일되고 오류없이 실행됩니다.

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; 

    } 

} 

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

원하는 출력 :

 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) 
+4

그렇게 될 것이라고 했습니까? 아마도 그렇지 않습니다. 목표를 반영하도록 제목을 변경하십시오 (예 : * 검색 *). 예 : "배열의 복사본 만들기" – user2246674

+0

@ user2246674 예, 그 외 다른 주제가 있습니다. – Yoda

+4

아니요, [깊은 사본을 만들 것이라고하지는 않습니다] (http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#copyOf (T % 5B % 5D , % 20int)). 이 과제에 대한 전체 주제가 * 존재하지만 많은 기존의 해답/접근법이 있습니다. (예 : [1] (http://stackoverflow.com/questions/64036/how-do-you-make-a-deep-copy-of-an-object-in-java), [2] (http : /stackoverflow.com/questions/3947227/deep-copy-of-an-object-array)) – user2246674

답변

1

내 출력은 내가생각잘 작동합니다. 문제가 있습니다. a2.zmienInformacje("Tove", "Jansson", 1956);Book b2 and b3을 인쇄하기 전에 Author a2을 업데이트하고 있습니다.

+0

맞습니다.하지만 문제는 제 학생의 선생님이 정확하게 '농락'을 이해하지 못한다는 것입니다. 그녀는 '작곡'에 대해 잘 이해하지 못했지만, 그녀는 이들 중 어느 것도 올바르게 구현할 수 없기 때문에 "그녀의 방식"으로해야합니다. – Yoda

+1

문제를 피할 수 있습니다. 유일한 가시적 인 문제는 속성을 가지고 있지 않은'Arrays.copyOf()'에 속성을 할당한다는 것입니다. – EJP

관련 문제