我有一个名为 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
会更简单。回首往事,并考虑到您的意见,这似乎是一个相当微不足道的好处,但代价是对性能的重大影响。
尽管我想更好地了解这些成本是什么,但我是否正确理解了您的想法?我(显然,我敢肯定)仍在学习和尝试各种事物,并且非常感谢任何有助于我识别失败实验的输入。