我有一個名爲Library的類擴展了ArrayList。我這樣做是因爲(我認爲)一個真正的關係存在於Library類和一個ArrayList之間 - 一個Library只是一個書籍集合,還有一些方法。擴展ArrayList並引用構造函數中的反序列化對象
其中的一種方法是load(),它將已保存的Library對象進行反序列化。我的問題是:如何使反序列化的對象進入庫的「活動」實例?我想在庫的構造函數中做類似this = load()
的事情,因爲load()
返回一個Library對象。但是,當我嘗試執行該操作時,出現編譯器錯誤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
會更簡單。回顧一下,並考慮到你的意見,看起來這是一個相當平凡的好處,它的代價是對性能產生重大影響。
雖然我想更好地瞭解這些成本是什麼,但我能正確理解您的想法嗎?我(很明顯,我確定)仍然在學習和嘗試各種各樣的事情,非常感謝任何幫助我識別失敗實驗的輸入。
刪除我的答案,支持這一個。 1+ – 2013-03-04 23:47:16
感謝您的輸入,請參閱我的編輯。 – drewmoore 2013-03-05 00:04:05
@ drewmore4首先,不要擔心表演。沒有什麼明顯的差異,並且我不清楚繼承是否會比組合更快。要修復你的設計,使你的ArrayList成爲一個私有變量,並創建庫方法來做你想做的事情。你的類的用戶甚至不應該知道里面有一個ArrayList。如果你的庫沒有做任何事情,除了和ArrayList交談,我建議根本沒有一個庫類(只需使用ArrayList)。 – 2013-03-05 00:25:34