0

我有一个名为 Library 的类,它扩展了 ArrayList。我这样做是因为(我认为)Library 类和 ArrayList 之间存在真正的 is-a 关系——Library 只是书籍的集合,加上一些方法。

其中一种方法是 load(),它反序列化保存的库对象。我的问题是:如何使反序列化的对象成为库的“活动”实例?我想在库的构造函数中做类似的事情this = load(),因为load()返回一个库对象。cannot assign a value to final variable this但是,当我尝试执行此操作时出现编译器错误。用于此目的的正确语法是什么?

public class Library extends ArrayList<Book> implements Serializable{

public Library(){
    load();
}
...

Library load() throws IOException, ClassNotFoundException {
    File f = new File (System.getProperty("user.home")+"\\Documents\\CardCat\\library.ser");   
    ObjectInputStream ois = new ObjectInputStream (new FileInputStream (f));   
    Library lib = (Library)ois.readObject();
    System.out.println("ran load sucessfully");
    return lib;
}

编辑:似乎普遍的共识是这是错误的方法,我应该创建一个不扩展 ArrayList 但具有 ArrayList 实例变量的库类。这实际上是我大约一个小时前的结构,但我认为扩展 ArrayList 可能会更简单一些。我这样做的主要理由是 ArrayList 是 Library 类的唯一变量,我经常从其他类中引用 ArrayList ,每次我这样做时我都必须调用library.libList,所以我认为能够简单地引用library会更简单。回首往事,并考虑到您的意见,这似乎是一个相当微不足道的好处,但代价是对性能的重大影响。

尽管我想更好地了解这些成本是什么,但我是否正确理解了您的想法?我(显然,我敢肯定)仍在学习和尝试各种事物,并且非常感谢任何有助于我识别失败实验的输入。

4

4 回答 4

2

不能this按设计覆盖。

需要考虑的一些事项:

  • 为什么库是 ArrayList?是否有任何情况下您需要将您的库分配给 ArrayList?图书馆是否有任何理由必须是列表并由数组支持?实施Collection可能是合理的,但会迫使您实施在您的设计中可能没有意义的方法。
  • 如果库不是 ArrayList,那么您可以使用composition,无论如何它更容易使用。只要有一个成员变量,它是一个 ArrayList(或任何类型的集合)。
  • 对于反序列化,您通常使用静态函数或工厂,而不是构造函数。请参阅其他答案以了解如何执行此操作。

为了用代码澄清我在下面的评论,这里有一个将书籍添加为实例变量的示例,然后创建从外部访问它们所需的任何方法:

class Library {
    private final Collection<Book> books = new ArrayList<Book>();

    public void addBook(Book book) {
        this.books.add(book);
    }

    public Collection<Book> getAllBooks() {
        ...
    }

    public Book getBookByTitle(String title) {
        ...
    }
}
于 2013-03-04T23:43:08.430 回答
1

你可以这样做:

public Library(){
    addAll(load());
}

正如其他人所说,这样做并不是最好的设计实践,但也许你正在做一些我们不知道的事情。

于 2013-03-04T23:40:32.727 回答
1

您应该进行加载而不是创建Library.

于 2013-03-04T23:39:51.510 回答
1

正确的做法是让方法 thar 返回load一个static全新的实例:

class Library {
  static Library load(Stream in) 
}
于 2013-03-04T23:39:54.580 回答