java - 扩展 ArrayList 并在构造函数中引用反序列化对象

标签 java this

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

其中一个方法是 load(),它反序列化保存的 Library 对象。我的问题是:如何使反序列化对象成为 Library 的“Activity ”实例?我想在库的构造函数中执行类似 this = load() 的操作,因为 load() 返回一个 Library 对象。但是,当我尝试执行此操作时,出现编译器错误 无法为最终变量 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 实例变量的 Library 类。这实际上是我大约一个小时前的结构,但我认为扩展 ArrayList 可能会更简单一些。我这样做的主要理由是 ArrayList 是 Library 类的唯一变量,我经常从其他类中引用该 ArrayList,每次这样做时我都必须调用library.libList ,所以我认为能够简单地引用 library 会更简单。回顾过去,并考虑到您的意见,这似乎是一个相当微不足道的好处,而且是以对性能造成重大影响为代价的。

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

最佳答案

can't overwrite this by design .

需要考虑的一些事项:

  • 为什么库是 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) {
        ...
    }
}

关于java - 扩展 ArrayList 并在构造函数中引用反序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15213226/

相关文章:

java - 找到应用程序崩溃的地方

java - 在 SWT FileDialog 中设置初始目录

java - 如何修复netbeans中的错误 "package weka does not exist"?

c++ - 使用带有此指针的重载输入运算符

c++在构造self期间将* this作为引用传递

javascript - this 在对象方法的内部函数中

java - 如何在 Java 中查找给定服务器的 DNS MX 记录?

java - 尝试将 ojdbc7 安装为 Maven 依赖项时出现问题

javascript - 获取后访问状态以显示它

java - 我什么时候应该在类里面使用 "this"?