我有一个名为 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/