在Java中如何通过对象的构造函数将对象添加到数组?

时间:2016-01-25 23:27:05

标签: java arrays constructor

我是一个相当新手的Java开发人员。我有一个用于表示书籍的Book类,以及一个用于表示库的Library类。

Library类中的一些代码:

/**
 * method to populate books list
 */
public static void populateBooksList() {

    // instantiate books

    Book b1 = new Book("Catch 22", "Heller", "Thriller", 5, 1, false);
    Book b2 = new Book("The Hobbit", "Tolkien", "Fantasy", 4, 2, false);
    Book b3 = new Book("Gullivers Travels", "Swift", "Adventure", 3, 3,
            false);
    Book b4 = new Book("Moby Dick", "Melville", "Crime", 4, 4, false);
    Book b5 = new Book("The Lord of the Rings", "Tolkien", "Fantasy", 4, 5,
            false);

    // populate the array

    books[0] = b1;
    books[1] = b2;
    books[2] = b3;
    books[3] = b4;
    books[4] = b5;

}

Book类中的一些代码(我没有粘贴所有的gets / sets):

public class Book {

    /**
     * declaring var for genre
     */
    private String genre;

    /**
     * declaring var for rating
     */
    private int rating;

    /**
     * declaring var for name
     */
    private String name;

    /**
     * declaring var for ID
     */
    private int iD;

    /**
     * declaring var for author
     */
    private String author;

    /**
     * declaring var for onLoan
     */
    private Boolean onLoan;

    /**
     * default constructor
     */
    public Book() {

    }

    /**
     * constructor with args
     * 
     * @param nameP
     *            - book name
     * @param authorP
     *            - book author
     * @param genreP
     *            - book genre
     * @param ratingP
     *            - book rating
     * @param iDP
     *            - book ID
     * @param onLoanP
     *            - onLoan
     */
    public Book(String nameP, String authorP, String genreP, int ratingP,
            int iDP, Boolean onLoanP) {
        this.name = nameP;
        this.iD = iDP;
        this.author = authorP;
        this.onLoan = onLoanP;
        this.genre = genreP;
        this.rating = ratingP;
    }

我想要做的是更有效地将书籍添加到数组中。如果我有50本书,我只需要50行代码来填充数组。我想在Book类中使用构造函数,或者以某种方式使用Book类中的gets / sets,或者使用Book类中包含的代码以其他方式自动将每个对象添加到数组中,因为它是实例化。这可能吗?

由于

S上。

5 个答案:

答案 0 :(得分:5)

您要求更多关于编程的一般概念,而不是Java本身。

简而言之 - 构造函数的唯一责任是创建和初始化一个对象。在构造函数中执行任何其他操作都是不好的做法。

您可以使用工厂模式:

public class BookCollection {
    public static final int MAX_COUNT = 20;

    private int count = 0;
    private Book[] books = new Book[MAX_COUNT];

    public Book createBook(String nameP, String authorP, String genreP, int ratingP, int iDP, Boolean onLoanP) {
        books[count] = new Book(nameP, authorP, genreP, ratingP, iDP, onLoanP);

        return books[count++];
    }

    public Book[] getBooks() {
         return books;
    }
}

此实现对许多问题都是开放的 - 例如创建了太多书籍,并发访问问题以及许多其他问题。

但是应该给你指导,去哪里。

就个人而言,我宁愿选择一个集合,比如ArrayList。不是数组。在某些情况下,数组很棒,但大多数时候ArrayList会好得多。

public class BookCollection {
    private List<Book> books = new ArrayList<Book>();

    public Book createBook(String nameP, String authorP, String genreP, int ratingP, int iDP, Boolean onLoanP) {
        Book result = new Book(nameP, authorP, genreP, ratingP, iDP, onLoanP)

        books.add(result);

        return result;
    }

    public List<Books> getBooks() {
         return Collections.unmodifiableList(books);
    }
}

答案 1 :(得分:1)

您可以将书籍直接分配给数组索引:

books[0] = new Book("Catch 22", "Heller", "Thriller", 5, 1, false);
books[1] = new Book("The Hobbit", "Tolkien", "Fantasy", 4, 2, false);
books[2] = new Book("Gullivers Travels", "Swift", "Adventure", 3, 3, false);
books[3] = new Book("Moby Dick", "Melville", "Crime", 4, 4, false);
books[4] = new Book("The Lord of the Rings", "Tolkien", "Fantasy", 4, 5, false);

编辑回答评论:

在这种情况下,您将书籍直接分配到数组位置而不使用其他变量。如果您现在Book b1 = books[0];,您仍然可以在索引0处获得对该书的引用。

事后看来,推荐使用数组初始化程序的其他答案更好,并做同样的事情。这样您甚至不需要预先指定数组或索引的大小:

Book[] books = new Book[] {
    new Book("Catch 22", "Heller", "Thriller", 5, 1, false);
    new Book("The Hobbit", "Tolkien", "Fantasy", 4, 2, false);
    new Book("Gullivers Travels", "Swift", "Adventure", 3, 3, false);
    new Book("Moby Dick", "Melville", "Crime", 4, 4, false);
    new Book("The Lord of the Rings", "Tolkien", "Fantasy", 4, 5, false);
}

答案 2 :(得分:1)

如果你使用原始数组(即Books [])而不是像List / Vector这样的数据结构,我认为你可以使用普通的数组init。 。e.g,:

预订[] books = {新书(bla,bla,bla),新书(foo,foo,foo),...};

但是,我更倾向于使用数据结构,并且有一些方法可以使用常量初始化数据结构,具体取决于结构和库。

答案 3 :(得分:1)

警告:我认识到这里的整个方法都存在问题,我只是按照要求回答问题。

将所有内容粘贴在一个arraylist中,让它管理自己的大小,然后将内容转储到一个从arraylist大小的数组中。

public Book(String title, String author, String genre, int rating, 
            int id, boolean onLoad, ArrayList<Book> array)
{
    //initialize stuff
    array.add(this);
}

在您设置对象的主代码中:

ArrayList<Book> tmpArray = new ArrayList<>();
//build your Book objects, passing in tmpArray
Book array[] = tmpArray.toArray(new Book[tmpArray.size()]);

你有你想要的阵列。

答案 4 :(得分:1)

// Poor
private Book[] books = new Book[5];
...
Book b1 = new Book("Catch 22", "Heller", "Thriller", 5, 1, false);
Book b2 = new Book("The Hobbit", "Tolkien", "Fantasy", 4, 2, false);
...
books[0] = b1;
books[1] = b2;

// Better
Book[] books = new Book[] {
  new Book("Catch 22", "Heller", "Thriller", 5, 1, false),
  new Book("The Hobbit", "Tolkien", "Fantasy", 4, 2, false)
};
...

// Better still
private ArrayList<Book> books = new ArrayList<Book>();
books.add(new Book("Catch 22", "Heller", "Thriller", 5, 1, false);
...
相关问题