2011-12-14 19 views
0

私はいくつかの機能を実装する抽象クラスを持っています、と言うとFileFormatとしましょう。サポートしたいファイル形式ごとに、ZipFileFormatまたはTextFileFormatなどのサブクラスがあります。ファイル形式の一部の機能は、ファイルをテキストストリームに変換する操作など、ステートフルです。しかし、他のいくつかの機能には、デフォルトのファイル拡張子やファイルの内容のためのマジックパターンプレフィックスなどの状態はありません。このプロパティを提供するためにオーバーライドすることができ、抽象メソッドを持っているだろう表現するオーバーライド可能なステートレスプロパティを表す最も良い方法は何ですか?

一つの方法:

abstract String getDefaultExtension(); 

... 

String getDefaultExtension() { return "txt"; } 

これは動作しますが、このプロパティの基本クラスの仮定を表現する方法はありません。この場合、FileFormat APIのクライアントは、戻り値getDefaultExtension()が時間の経過と共に決して変化しないと仮定したいと考えます。しかし、オーバーライドを使用すると、このインテントをサブクラスで宣言したり、ベースクラスの制限をアサートすることはできません。

代わりに、メンバ変数を使用することもできます。その場合、フォーマットのデフォルト拡張の値は基本クラスのコンストラクタに渡されます。しかし、クラスのインスタンス化ごとに記憶領域を占有するという点で、これは素晴らしいことではありません。ファイル拡張子の場合、すべてのインスタンスは同じ拡張子を持ちます。など

行くための別の方法は、あなたが構造を持っているPropertiesオブジェクト型ソリューションである静的であるか、できなかった、設定のバッグを保持するが、それは安全性を入力失い、APIドキュメント、

その他オプションやコメント?ありがとう。

答えて

0

少なくともJavaでは、クラスのフィールドとして格納すると、実際には追加の領域が占有されません。代わりに、クラスストアtxtStringの各インスタンスを持つの

あなたは

String fileExtension="txt"; 

があると、Javaは単に彼らが戻って元のコピーを参照しています。

あなたはまた、Java文字列に(

クラスのすべてのインスタンス間でフィールドが普遍的になるだろう
static final String fileExtension = "txt"; 

、および変更することができないを行うことができは不変です。私は、文字列を「変える」を参照すると、文字列内の個々の文字を変更するという意味ではなく、fileExtension="bfr";は、fileExtensionStringオブジェクトを指し、bfrの値が割り当てられます)。

+0

はい、私は、プロパティのための静的な最終メンバーを作ることができるが、もちろんこれらはオーバーライドできませんので、私はその後、コンストラクタにそれを渡すか、オーバーライドされたメソッドでそれを使用する必要があります。そうすれば、非共有データの問題を解決できます。各サブクラスはこのイディオムを実装する必要がありますが、それは機能します。 –

0

短い文字列が急増するのは本当に重要なのでしょうか?

それ以外にも、コメント以外にクラス自体の外で時間の不変性を指定する方法はありません。

反復データを避けるために、static final定数を使用し、ゲッターでそれを戻すことができます。 Javadocで@seeを使用すると、定数とゲッターが互いに参照されます。

マイナーセマンティクス以外のリテラルを持つゲッターよりも優れているかどうかはわかりません。

各サブクラスの拡張機能を自分自身で登録することができます。

あなたはいつものJavadocに追加情報を公開するために、カスタムドックレットを使用することができます。私も実際にJavadocに頼っているのは必ずしも最善の解決策だとは考えていません。

0

は、両方の操作を行います。基本クラスは、コンストラクタで初期化されたフィールドの値を返すデフォルト実装を持つことになります。サブクラスでゲッターをオーバーライドし、独自のロジックを追加できます。私は、クラスの各インスタンスに対して文字列"txt"を格納するために必要なメモリの問題は無関係であると考えています。サブクラスにハードコードされていてもそれを保存する必要があります。そして、私は個人的に約6バイトも気にしません。

0

ステートレスコードとステートフルコードの混在を避けるようにしてください。私の提案は、実装をクラスの2つの並列ツリーに分割することです。 1つは静的メタデータ(ファイル拡張子など)を含み、もう1つはメタデータで構成されたワーカーオブジェクトを含みます。

これは、あなたがZipFileFormatのすべてのインスタンスで使用するZipFileTypeシングルトンを与えるでしょう。

+0

はい、私はそれが私が頼りにしてきた解決策だと思います。もう少し仕事はありますが、それは表現力に欠かせないものです。 –

+0

他のインプリメントにもよります。詳細は、静的並列クラスは、ファクトリクラスまたは同様のものとすることができる。 – BRFennPocock

+0

また、メタデータを工場で使用して実装を構築することもできます。 –

関連する問題