2016-01-25 117 views
3

我是一個相當新手的Java開發人員。我有一個Book類代表一本書,一個Library類代表一個圖書館。在Java中,我如何通過對象的構造函數將對象添加到數組中?

從庫類的一些代碼:

/** 
* 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; 

} 

,並從賬類的一些代碼(我沒貼在所有的獲取/套):

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.

+2

我不會擔心太多,在現實生活中,您會從外部來源(如配置文件或數據庫)填充結構,而不是通過枚舉源代碼中的每條記錄。這會讓你的代碼比任何編碼技巧效率更高,但是整齊。 – biziclop

+0

謝謝!我會牢記這一點。 – stu176

回答

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

嗨喬治謝謝,在這種情況下,這意味着每個陣列位置中的每個書對象都沒有引用?如果我分別實例化它們,我可以給每個對象引用b1,b2等等等等。使用上面的這個方法,那些引用會起作用嗎? – stu176

+0

@ stu176在更新後的答案中回答了您的問題。 –

1

如果使用原始陣列(即圖書[]),而不是像列表/矢量數據結構,我想你可以使用普通的數組init。 例如:

Book [] books = {new Book(bla,bla,bla),new Book(foo,foo,foo),...};但是,我傾向於更喜歡數據結構,並且可以使用常量來初始化這些數據結構,具體取決於結構和庫。

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

好的,我會研究這個...... – stu176

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()]); 

而且你有你想要的陣列。

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); 
... 
+1

我喜歡代碼的最後部分的外觀...似乎我可以實例化這本書,並將它添加到同一行中的ArrayList書...這是我的目標爲:) – stu176

相關問題