3

私は現在、次のようなことを達成しようとしています: このクラスに基づいて、クラス Class<? の新しいインスタンスを作成しようとしています。メソッド getValidator() によって返される AbstractValidator> を拡張します。

public abstract class AbstractEnumDefinition
       extends AbstractRequestFieldDefinition {

    private Vector<String> values = new Vector<String>();

    public abstract void define(String lang);

    protected void addEnumDefinition(String value){
        values.add(value);
    }

    public Vector<String> getValues(){
        return values;
    }

    @Override
    public Class<? extends AbstractValidator> getValidator() {
        return new AbstractValidator() {
            @Override
            public boolean isValid(String value) {
                return values.contains(value);
            }

            @Override
            public String getDefaultValue() {
                return "";
            }
        }.getClass();
    }
}

このクラスを作成するとします。

public class LanguageDefinition extends AbstractEnumDefinition {

    public LanguageDefinition() {
        super();
    }

    @Override
    public void define(String language) {
        addEnumDefinition("BEL-fr");
        addEnumDefinition("BEL-nl");
        addEnumDefinition("BEL-en");
    }
}

コードの後半で、私は呼び出します

new LanguageDefinition().getValidator().getConstructor().newInstance()

ここでインスタンス化しようとしているクラスはどこにも宣言されていませんが、AbstractEnumDefinition クラス内で「動的に生成」/「動的に作成」されています。

これをやろうとすると、java.lang.InstantiationExceptionforを取得します

be....servlets.model.extraction.filter.editor.AbstractEnumDefinition$1

これは、このクラスを動的に参照するのではなく、事前に明示的に作成する必要があるためでしょうか?

バリデーターごとに 1 つのクラスを作成する必要がないようにする解決策はありますか?

助けてくれてありがとう、

エリック

4

2 に答える 2

2

実際にクラスを使用しているコードが表示されないため、推測しかできませんが、確認する必要があります: http://docs.oracle.com/javase/6/docs/api/java/lang/InstantiationException. html

言及されていることの1つは、インスタンス化が失敗する可能性があるということです。これは、クラスが抽象クラスであることです(抽象クラ​​スをインスタンス化できないため、完全に論理的です)。

また、クラスを返してから作成してオブジェクトを作成する必要がある理由がわかりません。Validator Interface を定義して、メソッドが Validator オブジェクトを返すようにしないのはなぜですか。

于 2012-03-30T13:07:46.070 に答える
1

私の知る限り、匿名クラスでは機能しません。クラスを名前付き内部クラスに変換する必要があります。

ただし、デフォルトのコンストラクターがない可能性があるため、それでも正しく機能しません。内部クラスは、暗黙的なコンストラクター引数を取得して、外側のクラスへの参照を保持します。残念ながら、クロージャーは静的言語ではうまく機能しません。

要約すると、非静的な内部クラスは、囲んでいるクラスのインスタンスの外部でインスタンス化できません。

于 2012-03-30T13:09:45.573 に答える