私はいくつかの機能を実装する抽象クラスを持っています、と言うとFileFormat
としましょう。サポートしたいファイル形式ごとに、ZipFileFormat
またはTextFileFormat
などのサブクラスがあります。ファイル形式の一部の機能は、ファイルをテキストストリームに変換する操作など、ステートフルです。しかし、他のいくつかの機能には、デフォルトのファイル拡張子やファイルの内容のためのマジックパターンプレフィックスなどの状態はありません。このプロパティを提供するためにオーバーライドすることができ、抽象メソッドを持っているだろう表現するオーバーライド可能なステートレスプロパティを表す最も良い方法は何ですか?
一つの方法:
abstract String getDefaultExtension();
...
String getDefaultExtension() { return "txt"; }
これは動作しますが、このプロパティの基本クラスの仮定を表現する方法はありません。この場合、FileFormat
APIのクライアントは、戻り値getDefaultExtension()
が時間の経過と共に決して変化しないと仮定したいと考えます。しかし、オーバーライドを使用すると、このインテントをサブクラスで宣言したり、ベースクラスの制限をアサートすることはできません。
代わりに、メンバ変数を使用することもできます。その場合、フォーマットのデフォルト拡張の値は基本クラスのコンストラクタに渡されます。しかし、クラスのインスタンス化ごとに記憶領域を占有するという点で、これは素晴らしいことではありません。ファイル拡張子の場合、すべてのインスタンスは同じ拡張子を持ちます。など
行くための別の方法は、あなたが構造を持っているProperties
オブジェクト型ソリューションである静的であるか、できなかった、設定のバッグを保持するが、それは安全性を入力失い、APIドキュメント、
その他オプションやコメント?ありがとう。
はい、私は、プロパティのための静的な最終メンバーを作ることができるが、もちろんこれらはオーバーライドできませんので、私はその後、コンストラクタにそれを渡すか、オーバーライドされたメソッドでそれを使用する必要があります。そうすれば、非共有データの問題を解決できます。各サブクラスはこのイディオムを実装する必要がありますが、それは機能します。 –