Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,如何通过对象';谁的构造函数?_Java_Arrays_Constructor - Fatal编程技术网

在Java中,如何通过对象';谁的构造函数?

在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

我是一个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 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);
...