2014-11-08 110 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); 
}