我是一个相当新手的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上。
答案 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);
...