2013-03-04 63 views
0

我有一個名爲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會更簡單。回顧一下,並考慮到你的意見,看起來這是一個相當平凡的好處,它的代價是對性能產生重大影響。

雖然我想更好地瞭解這些成本是什麼,但我能正確理解您的想法嗎?我(很明顯,我確定)仍然在學習和嘗試各種各樣的事情,非常感謝任何幫助我識別失敗實驗的輸入。

回答

2

can't overwrite this by design

有些事情要考慮:

  • 爲什麼一個圖書館一個ArrayList?是否有任何情況下需要將庫分配給ArrayList?是否有任何理由,一個庫必須是一個List並支持一個數組?實施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) { 
     ... 
    } 
} 
+0

刪除我的答案,支持這一個。 1+ – 2013-03-04 23:47:16

+0

感謝您的輸入,請參閱我的編輯。 – drewmoore 2013-03-05 00:04:05

+1

@ drewmore4首先,不要擔心表演。沒有什麼明顯的差異,並且我不清楚繼承是否會比組合更快。要修復你的設計,使你的ArrayList成爲一個私有變量,並創建庫方法來做你想做的事情。你的類的用戶甚至不應該知道里面有一個ArrayList。如果你的庫沒有做任何事情,除了和ArrayList交談,我建議根本沒有一個庫類(只需使用ArrayList)。 – 2013-03-05 00:25:34

1

您應該執行加載而不是製作Library的新實例。

1

做到這一點,正確的做法是讓load一個static方法塔爾返回一個全新的實例:

class Library { 
    static Library load(Stream in) 
} 
1

你可能只是這樣做:

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

正如其他人所說,它並不是最好的設計實踐,但也許你正在做一些我們不知道的事情。

+0

是,這當然有效。鑑於我上面的編輯,你認爲這種方法是有道理的嗎? – drewmoore 2013-03-05 00:04:57

相關問題