2014-11-08 3 views
1

Я относительно новичок в языке Java и имею проект, который я делаю для школы, в которой у меня есть класс 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; 
     } 

Перед тем как перейти к переопределениям, я хочу, чтобы убедиться, что я получаю это правильно. Я попытался найти похожие примеры, чтобы я мог понять, что происходит, но пока у меня не было большой удачи. Я уверен, что это очень просто, но я только начинаю изучать язык. Спасибо за помощь

+0

Какие у вас проблемы? Вы имеете в виду опечатки, которые помешали бы этому компиляции? – khelwood

ответ

4

Прежде всего, в конструкторе по умолчанию, чтобы избавиться от

authorSet = null; 

и вместо того, чтобы инициализировать переменную authorSet на новый HashSet. Причина этого заключается в том, что вы хотите создать контейнер authorSet независимо от того, добавлены ли какие-либо авторы для начала.

Возможно, вам понадобится конструктор, который принимает только строку isbn. Также рассмотрим конструктор, который принимает значение isbn String и переменное число Author Strings.


Ах, я пропустил это:

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

+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

Я думаю, что цель иметь setIsbn - понимать методы продвижения вперед. Мне это не нужно, но профессор хочет, чтобы он включал в себя то же самое. – user2649644

+0

Хорошо, добавьте это. Все еще обратите внимание на отсутствие конструктора по умолчанию и использование ключевого слова final. –

1

Для получения дополнительной информации, практика возврата вашей фактической реализации (набора) может позволить вызывающему гадости с вашими внутренностями. Таким образом, это немного опасное:

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