0

さて、セットアップは次のとおりです。

EnclosingClass {

    public interface ClassFactory {
        public static SomeClass getInstance(int which);
    }

    private static ClassFactoryImpl {
        @Override
        public static SomeClass getInstance(int which) {
            switch(which) {
            case 1:
                return new SomeClassSubclassA();
            case 2:
                return new SomeClassSubclassB();
            ...
            }
        }
    }
}

私は、次のような声明を発表できるようにしたいと考えています。

SomeClass x = EnclosingClass.ClassFactory.getInstance(instanceClassRequest);

これは可能ですか?そうでない場合、実装するインターフェイスのみを介して静的なネストされたクラスにアクセスするにはどうすればよいですか?

4

1 に答える 1

2

短い答えは「いいえ」です。実装クラスのインスタンスを作成し、それを静的変数に入れる必要があります。次のようになります。

public class EnclosingClass {
    public interface ClassFactory {
        public SomeClass getInstance(int which);
    }
    public static final ClassFactory CLASS_FACTORY;

    private static class ClassFactoryImpl implements ClassFactory {
        public SomeClass getInstance(int which) { /* ... */ }
    }

    static {
        CLASS_FACTORY = new ClassFactoryImpl();
    }
}

また、インスタンスのメソッドが静的ではなくなったことにも注意してください。

次に、それを呼び出すコードは次のようになります。

SomeClass x = EnclosingClass.CLASS_FACTORY.getInstance(2);
于 2012-07-06T20:27:03.437 に答える