私は一般的に拡張に反対します。なぜなら、それはクラス間の非常に強いつながりを生み出し、それは偶然に壊れやすいからです。
しかし、私はついにそれの合理的なケースを見つけたと思いました-私はオプションで既存のシステムでファイルタイプの圧縮バージョンを使用したいと思います。圧縮されたバージョンは、圧縮されていないバージョンとほぼ同じ速さで、まったく同じメソッド(つまり、読み取りと書き込み)を使用できます。唯一の違いは、ディスク上の表現にあります。したがって、圧縮バージョンに非圧縮バージョンを拡張して、オプションで他のタイプをインサンティファイするだけで、どちらの種類のファイルも使用できるようにしました。
public class CompressedSpecialFile extends SpecialFile(){ ... }
if (useCompression){
SpecialFile = new CompressedSpecialFile();
} else {
SpecialFile = new SpecialFile();
}
ただし、プログラムの後の時点で、リフレクションを使用します。
Object[] values = new Object[]{SpecialFile sf, Integer param1, String param2, ...}
Class myclass = Class.forName(algorithmName);
Class[] classes = // created by calling .getClass on each object in values
constructor = myclass.getConstructor(classes);
Algorithm = (Algorithm) constructor.newInstance(values)
これはすべて正常に機能しましたが、SpecialFileの実行時型がCompressedSpecialFileであるため、myclass.getConstructorクラスはNoSuchMethodExceptionをスローします。
ただし、これが拡張機能の動作方法だと思いました。CompressedSpecialFileはSpecialFileを拡張するため、SpecialFileを受け入れるパラメーターはすべてCompressedSpecialFileを受け入れる必要があります。これはJavaの反映の誤りですか、それとも私の理解の失敗ですか?