0

ArrayListを拡張するLibraryというクラスがあります。私がこれを行ったのは、(私が思うに)本当のことです-LibraryクラスとArrayListの間に関係が存在する-Libraryは単に本のコレクションといくつかのメソッドです。

それらのメソッドの1つはload()で、保存されたLibraryオブジェクトを逆シリアル化します。私の質問は、逆シリアル化されたオブジェクトをライブラリの「アクティブな」インスタンスにするにはどうすればよいですか?Libraryオブジェクトを返す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インスタンス変数を持つLibraryクラスを作成する必要があるというのが普遍的なコンセンサスのようです。これは実際には約1時間前に構造化した方法ですが、ArrayListを拡張する方が少し簡単かもしれないと思いました。これの主な理由は、ArrayListがLibraryクラスの唯一の変数であり、他のクラスからそのArrayListを頻繁に参照し、そのたびにを呼び出す必要があったためlibrary.libList、単純に参照できると思いました。library簡単になります。振り返って、あなたの入力を考慮に入れると、これはかなり些細な利点であり、パフォーマンスに大きな打撃を与えるという犠牲を払うことになります。

それらの費用をもっとよく理解したいのですが、あなたの考えを正しく理解していますか?私は(明らかに、確かに)まだあらゆる種類のことを学び、実験しており、失敗した実験を特定するのに役立つ入力に非常に感謝しています。

4

4 に答える 4

2

設計上上書きthisすることはできません。

考慮すべきいくつかの事柄:

  • ライブラリが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) {
        ...
    }
}
于 2013-03-04T23:43:08.430 に答える
1

の新しいインスタンスを作成する代わりに、ロードを実行する必要がありますLibrary

于 2013-03-04T23:39:51.510 に答える
1

これを行う正しい方法はloadstaticメソッドtharがまったく新しいインスタンスを返すようにすることです。

class Library {
  static Library load(Stream in) 
}
于 2013-03-04T23:39:54.580 に答える
1

あなたはこれを行うことができます:

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

他の人が言っているように、これを行うのは最良の設計手法ではありませんが、おそらくあなたは私たちが知らないことをしているのでしょう。

于 2013-03-04T23:40:32.727 に答える