たとえば、1つの具体的なケースにはメソッドが多すぎるクラスがありますが、それらの約半分に収まるので、それを拡張するしかありません。同時に、このファットクラスをエンドユーザーから拡張したという事実を隠したいと思います。UnsupportedOperationException
次に、そのクラスをいくつかの新しいインターフェイスで制限し、不要なメソッドに:をスローさせたいと思います。
public class TooFatClass {
public void usefulMethodOne() { ... };
public void usefulMethodTwo() { ... };
public void usefulMethodThree() { ... };
...
public void notUsefulMethodOne() { ... };
public void notUsefulMethodTwo() { ... };
public void notUsefulMethodThree() { ... };
...
}
public interface OnlyUsefulMethods {
public void usefulMethodOne();
public void usefulMethodTwo();
public void usefulMethodThree();
...
public static OnlyUsefulMethods create() {
return new OnlyUsefulMethodsImpl();
}
}
// notice it is package-private
class OnlyUsefulMethodsImpl extends TooFatClass implements OnlyUsefulMethods {
public void usefulMethodOne() { ... };
public void usefulMethodTwo() { ... };
public void usefulMethodThree() { ... };
...
public void notUsefulMethodOne() { throw new UnsupportedOperationException(); };
public void notUsefulMethodTwo() { throw new UnsupportedOperationException(); };
public void notUsefulMethodThree() { throw new UnsupportedOperationException(); };
...
}
したがって、ユーザーが本当に必要な場合はOnlyUsefulMethodsImpl
インスタンスをキャストできTooFatClass
ますが、この事実を隠し、ユーザーにそうするように強制することはありません。
ただし、Javaではインターフェイスでの静的メソッドの実装が許可されていないため(OnlyUsefulMethods
抽象化するのは馬鹿げていると思います)、次のような臭いコードで終了します。
public interface OnlyUsefulMethods {
public void usefulMethodOne();
public void usefulMethodTwo();
public void usefulMethodThree();
...
public static final class Factory {
public static OnlyUsefulMethods create() { return new OnlyUsefulMethodsImpl(); }
public static OnlyUsefulMethods create(Options options) {
return new OnlyUsefulMethodsImpl(options); }
}
}
インターフェイスの外側に移動する場合でもFactory
、1つのクラスのケースだけに使用するには複雑すぎるように見えますが、外側に表示せずにファクトリメソッドが必要ですOnlyUsefulMethodsImpl
。
私は何か間違っている/複雑すぎて、いくつかの制限パターンが欠けていますか?
この質問に関連している可能性があります(とにかく、適切な答えがいくつかありますが、よくわかりません):