3

RandomAccessFileオブジェクトを使用するプログラムを編集していて、ファイルオブジェクト以外のデータに別のソースを使用する独自のRandomAccessFileクラスを考え出したい(これはAmazon WebServices S3オブジェクトですが、関係ありません)。

基本的には、RandomAccessFileをスーパークラスとするRandomAccessS3というクラスを作りたいので、簡単に言うことができます。

RandomAccessFile raf = new RandomAccessS3();

したがって、既存のコードを同じに保ちます。RandomAccessFileのすべてのメソッドをオーバーライドするだけです。

問題は、サブクラスRandomAccessS3のコンストラクターで、パラメーターとしてファイル名を受け取るsuper(file、mode)を使用してRandomAccessFileのコンストラクターを呼び出さなければならず、ファイルが無効な場合はエラーをスローして終了することです。

コンストラクターの最初の行はsuperである必要があるため、super()呼び出しをtry/catchブロックで囲むことはできません。ダミーファイルを提供することはできますが、ユーザーにそれを強制したくありません。これを回避する簡単な方法はありますか?

ありがとう!

4

2 に答える 2

4

ええと、あなたは実際にスーパークラスに名前属性か何かを設定することができます。そして、そのクラスのコンストラクターで、そのクラスに属するnameインスタンス変数に渡されるStringの値を設定します。

このように、すべての派生物は子インスタンスをインスタンス化するときに何かを渡す必要があり、渡される値は親クラスに延期されます。このようにして、super()を常にデリバティブで呼び出すように強制できます。

于 2014-08-19T01:31:48.187 に答える
3

これを回避する簡単な方法はありません。コンストラクターは、インスタンスが良好/有効な状態にあることを確認するためにあり、RandomAccessFileのコントラクトの一部は、インスタンスが有効なファイルにリンクされていることです。

巨大なハックとして、RandomAccessFileコンストラクターを満たすためだけに、一時ファイルを作成できると思います。

より良いアプローチは、おそらく新しいインターフェースを作成し、RandomAccessFileから新しいインターフェースへの参照を更新することです。次に、インターフェイスを2回実装します。1回はRandomAccessFileを使用し、もう1回はS3呼び出しを使用します。

于 2011-06-22T23:48:02.230 に答える