2014-11-08 107 views
1

我對Java語言比較陌生,並且有一個項目,我正在爲學校做一個Book類,它有這個類的普通setter/getters,構造函數和覆蓋,沒有任何東西複雜。我必須改變它,所以我可以通過使用Set和HashSet來獲得多個作者。我的問題是我該如何去做這件事?到目前爲止,並糾正我,如果我錯了,我有這個Set和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; 
     } 

上移動到覆蓋之前,我要確保我得到這個正確。我試圖尋找類似的例子,所以我可以看到發生了什麼,但我還沒有很多運氣。我相信這很簡單,但我剛開始學習這門語言。感謝您的幫助

+0

你有什麼問題?你是否認爲會妨礙編譯的錯別字? – khelwood 2014-11-08 19:03:38

回答

4

首先,在默認的構造函數,擺脫

authorSet = null; 

,而是你的authorSet變量初始化爲一個新的HashSet。原因是你想創建authorSet容器,不管是否添加了任何作者。

你可能會想要一個構造函數,只需要一個isbn字符串。還要考慮一個構造函數,它使用isbn String和可變數量的作者字符串。


啊,我錯過了這一點:

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

     // Do I do anything else here? 
    } 

因爲你忽略這兩個參數和字段不好!相反,請將設置參數分配給現有字段,就像使用其他字段一樣。

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

然後給你的班級一個addAuthor(String author)方法。因爲這是作業,所以更好地編碼。對於這個問題,我真的不認爲你需要更多的東西。

+0

此外,採用'Set'的構造函數應該將傳入的一個賦值給'authorSet',而不是創建一個新的。 – azurefrog 2014-11-08 19:04:36

+0

也許爲了學習而詳細闡述爲什麼他應該擺脫'authorSet = null;'的作用? – mattias 2014-11-08 19:05:16

+0

@azurefrog:yikes錯過了!謝謝! – 2014-11-08 19:06:00

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

我認爲擁有setIsbn的目的是理解前進的方法。我不需要,但教授希望它包含在同一個 – user2649644 2014-11-08 19:49:15

+0

好酷,加入。仍然,請注意缺乏默認構造函數和使用final關鍵字。 – 2014-11-08 19:58:48

1

爲了獲得額外的積分,返回實際集合(set)實現的做法可以讓調用者使用內部消耗。因此,這是一個有點危險:

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

更安全:

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

同樣,如果你有需要接受您的API中新集,但不想相信不遲違反呼叫者您的代表,那麼你可能會這樣做:

public void setAuthorSet(Set<String> newAuthorSet) { 
    authorSet = new HashSet<String>(newAuthorSet); 
}