在Java中,如何通过对象';谁的构造函数?
我是一个Java开发新手。我有一个Book类来表示一本书,还有一个Library类来表示一个图书馆 库类中的一些代码:在Java中,如何通过对象';谁的构造函数?,java,arrays,constructor,Java,Arrays,Constructor,我是一个Java开发新手。我有一个Book类来表示一本书,还有一个Library类来表示一个图书馆 库类中的一些代码: /** * method to populate books list */ public static void populateBooksList() { // instantiate books Book b1 = new Book("Catch 22", "Heller", "Thriller", 5, 1, false); Book b
/**
* 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类中的一些代码(我没有粘贴所有的get/set):
我想做的是使向数组中添加书籍更有效。如果我有50本书,我需要50行代码来填充数组。我希望在Book类中使用构造函数,或者以某种方式使用Book类中的get/set,或者以其他方式使用Book类中包含的代码,以便在实例化每个对象时自动将其添加到数组中。这可能吗
谢谢
S.您可以将书本直接分配给数组索引:
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);
编辑以回答评论:
在这种情况下,您直接将书本指定给数组位置,而不使用其他变量。如果你现在做了bookb1=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);
}
如果您使用基本数组(即Books[]),而不是List/Vector之类的数据结构,我认为您可以使用普通数组init。
e、 g.,:
书籍[]书籍={新书(bla,bla,bla),新书(foo,foo,foo),…}
但是,我倾向于选择数据结构,根据结构和库的不同,有一些方法可以用常量初始化数据结构。您要了解的是编程的一般概念,而不是Java本身
简言之,构造函数的唯一职责是创建和初始化对象。在构造函数中执行任何其他操作都是不好的做法
但您可以使用factory模式:
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);
}
}
公共类图书收藏{
private List books=new ArrayList();
PublicBookCreateBook(字符串nameP、字符串authorP、字符串genreP、int ratingP、int iDP、Boolean onLoanP){
图书结果=新书(nameP、authorP、genreP、ratingP、iDP、onLoanP)
添加(结果);
返回结果;
}
公共列表getBooks(){
返回集合。不可修改的列表(书籍);
}
}
警告:我认识到这里的整个方法都有问题,我只是回答问题
将所有内容都粘贴到arraylist中,让它管理自己的大小,然后将内容转储到arraylist以外大小的数组中
public Book(String title, String author, String genre, int rating,
int id, boolean onLoad, ArrayList<Book> array)
{
//initialize stuff
array.add(this);
}
公共书籍(字符串标题、字符串作者、字符串类型、整数评级、,
int-id,布尔onLoad,ArrayList数组)
{
//初始化内容
数组。添加(此);
}
在设置对象的主代码中:
ArrayList<Book> tmpArray = new ArrayList<>();
//build your Book objects, passing in tmpArray
Book array[] = tmpArray.toArray(new Book[tmpArray.size()]);
ArrayList tmpArray=new ArrayList();
//构建书本对象,传入tmpArray
书籍数组[]=tmpArray.toArray(新书[tmpArray.size()]);
您就有了所需的阵列。//Poor
// 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);
...
私人书籍[]书籍=新书[5];
...
书b1=新书(“第22条军规”,“海勒”,“惊悚”,5,1,假);
书b2=新书(“霍比特人”、“托尔金”、“幻想”,4,2,假);
...
图书[0]=b1;
图书[1]=b2;
//更好
书[]书=新书[]{
新书(《第22条军规》、《海勒》、《惊悚》,5,1,错),
新书(《霍比特人》,《托尔金》,《幻想》,4,2,错)
};
...
//更好
private ArrayList books=new ArrayList();
图书。添加(新书(“第22条军规”,“海勒”,“惊悚片”,5,1,假);
...
我不会太担心这个问题,在现实生活中,您可以从外部源(如配置文件或数据库)填充结构,而不是枚举源代码中的每个记录。这将使您的代码比任何编码技巧都更加高效,无论多么简洁。谢谢!我会记住这一点。我喜欢c最后一部分的外观ode…似乎我可以实例化这本书并将其添加到同一行的ArrayList books中…这就是我的目标:)嗨,乔治,谢谢,在这种情况下,这意味着每个数组位置中的每个book对象都没有引用?如果我分别实例化它们,我可以给每个对象提供引用b1、b2等。使用上面的方法,这些引用在哪里发挥作用?
// 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);
...