2014-11-08 2 views
1

저는 Java 언어에 비교적 익숙하지 않고이 클래스에 대한 일반적인 setter/getters, constructors 및 overrides를 가진 Book 클래스가있는 학교에서 프로젝트를하고 있습니다. 복잡한. Set과 HashSet을 이용하여 여러 명의 저자를 얻을 수 있도록 변경해야합니다. 내가 가진 질문은 어떻게이 일을 어떻게 할 것인가? 내가 틀렸다면 지금까지 저를 수정,이Set and HashSet Java

import java.util.*; 

public class Book{ 

     private Set<String> authorSet; 
     private String isbn; 

     public Book(){ 
      authorSet = null; 
      isbn = null; 
     } 

     public Book(String isbn, Set<String> authorSet){ 
      this.isbn = isbn; 
      Set<String> s = new HashSet<String>(); 

      // Do I do anything else here? 
     } 

     public String getIsbn(){ 
      return isbn; 
     } 

     public void setIsnb(String isbn){ 
      this.isbn = isbn; 
     } 

     public Set<String> getAuthorSet(Set<String> newAuthorSet{ 
      return newAuthorSet; 
     } 

     public void setAuthorSet(Set<String> newAuthorSet){ 
      this.authorSet = newAuthorSet; 
     } 

가 오버라이드 (override)에 이동하기 전에, 내가 제대로이를 얻을 수 있는지 확인하려면있다. 나는 비슷한 일들을 찾기 위해 노력했기 때문에 무슨 일이 일어나는 지 알 수 있었지만 나는 아직 운이 없었습니다. 나는 그것이 매우 간단하다고 확신하지만, 나는 언어를 배우기 시작했다. 도움 모든

+0

어떤 문제가 있습니까? 이 컴파일을 막는 오타가 있음을 의미합니까? – khelwood

답변

4

먼저 주셔서 감사합니다는 기본 생성자에서,

authorSet = null; 

을 제거하고 대신 새로운 HashSet의에 authorSet 변수를 초기화합니다. 그 이유는 작성자가 추가되었는지 여부에 관계없이 authorSet 컨테이너를 만들려고하기 때문입니다.

아마도 isbn String을 취하는 생성자가 필요할 것입니다. 또한 isbn String과 다양한 수의 작성자 문자열을 사용하는 생성자를 고려하십시오.


아, 내가 놓친이 :

당신이 매개 변수와 필드를 모두 무시로
public Book(String isbn, Set<String> authorSet){ 
     this.isbn = isbn; 
     Set<String> s = new HashSet<String>(); 

     // Do I do anything else here? 
    } 

좋지 않아! 대신 다른 필드와 마찬가지로 set 매개 변수를 기존 필드에 할당하십시오.

public Book(String isbn, Set<String> authorSet){ 
     this.isbn = isbn; 
     this.authorSet = authorSet; 
    } 

그런 다음 클래스에 addAuthor(String author) 메소드를 제공하십시오. 숙제이므로 코드를 작성하는 것이 좋습니다. 나는이 문제에 관해서 당신이 필요로하는 것이 훨씬 더 많다고 생각하지 않습니다.

+0

또한,'Set '을 취하는 생성자는 새로운 것을 생성하는 대신에 들어오는 것을'authorSet'에 할당해야합니다. – azurefrog

+0

학습을 위해서'authorSet = null;'을 제거해야하는 이유에 대해 조금 더 자세히 설명해 주시겠습니까? – mattias

+0

@azurefrog : yikes가 그것을 놓쳤습니다! 감사! –

2

기본 생성자를 제거했습니다. 또한 authorSet을 설정해야하는 이유는 무엇입니까? 그것에서 다만 추가하고 제거하는 것이 낫지 않을까요? 또한 왜 isbn을 설정해야합니까? 대신에 생성자에서 변경 내용을 가져와야한다고 생각하지는 않습니다. 어때?

import java.util.HashSet; 
import java.util.Set; 

public class Book { 

    private final Set<String> authorSet; 
    private final String isbn; 

    public Book(String isbn) { 
     this.isbn = isbn; 
     this.authorSet = new HashSet<>(); 
    } 

    public String getIsbn() { 
     return isbn; 
    } 

    public Set<String> getAuthorSet() { 
     return authorSet; 
    } 

    public void addAuthor(String author) { 
     authorSet.add(author); 
    } 

    public void removeAuthor(String author) { 
     authorSet.remove(author); 
    } 
} 
+0

나는이 계획을 가지고있는 목적이 앞으로 나아갈 방법을 이해하는 것이라고 생각한다. 필요하지는 않지만 교수님이 포함 시키길 바랄뿐입니다. – user2649644

+0

좋습니다. 기본 생성자가 부족하고 최종 키워드가 사용되었습니다. –

1

실제 콜렉션 (설정) 구현을 반환하는 관례는 호출자가 내선을 골고루 쓸 수 있도록 허용합니다. 따라서이 조금 위험합니다 :

public Set<String> getAuthorSet() { 
    return authorSet; 
} 

안전 : 마찬가지로 당신이 당신의 API의 새로운 세트를 수락해야했지만, 나중에 위반하지 호출자를 신뢰하지 않은 경우

public Set<String> getAuthorSet() { 
    return Collections.unmodifiableSet(authorSet); 
} 

귀하의 진술은 다음과 같이 처리 할 수 ​​있습니다 :