1
public class Test {
    public static void main(String[] args) {
        DemoAbstractClass abstractClass = new DemoAbstractClass() {
            private String val;

            @Override
            public void runner() {
                val = "test";
                System.out.println(val);
                this.run();
            }

            public String getVal() {
                return val;
            }
        };

        abstractClass.runner();

        /**
         * I want to access getVal method here
         */
    }
}

abstract class DemoAbstractClass {
    public void run() {
        System.out.println("running");
    }

    public abstract void runner();
}

ここでは、抽象クラス DemoAbstractClass を宣言しています。もちろん、このクラスを拡張してこのメ​​ソッドを追加する新しいクラスを作成できます。しかし、私のシナリオではそれをしないほうがいいです。上記のコードでgetValメソッドにアクセスする他の方法はありますか??

4

5 に答える 5

6

できません。そこから適切な (無名の) クラスを作成する必要があります。スコープを制限する場合は、内部プライベート クラスにします。

または、StringBuffer を使用して、メソッド間で参照を共有することもできます。ただし、非常にきれいではありません。

関連する質問:

于 2012-06-14T15:44:11.953 に答える
1

もう1つのオプションは、StringBuilderをmainメソッドのメンバーにし、匿名の内部メソッドのクロージャーの性質を使用することです。

public static void main(String[] args) {
    final StringBuilder value = new StringBuilder();
    DemoAbstractClass abstractClass = new DemoAbstractClass() {
        @Override
        public void runner() {
            value.append( "test" );
            System.out.println(val);
            this.run();
        }
    };

    abstractClass.runner();

    // use val here...
    String val = value.toString();
}
于 2012-06-14T15:52:13.667 に答える
1

リフレクションを使用しない限り、オブジェクトの具象型にアクセスできないため、メソッド呼び出しをバインドできません。

このようなことを正気の方法で行いたくない場合は、名前付きクラスを宣言し、それを型として使用しますabstractClass

于 2012-06-14T15:44:43.937 に答える
1

Unfortunately, if you cannot name the type, you cannot access the methods at the language level.

What you can do, though, is use the reflection API to get a Method object and invoke it on this object.

This, however, is pretty slow. A private class or private interface would be much faster.

于 2012-06-14T15:45:15.457 に答える
1

もちろん、このクラスを拡張してこのメ​​ソッドを追加する新しいクラスを作成できます。

これはすでに完了しています。最終結果は匿名の内部クラスでした。new DemoAbstractClass() { ... };その宣言を独自のクラスに移動しただけで、それをプライベート クラスにすることもできます。getVal にアクセスできます。

上記の例に従って:

public class Test {
    public static void main(String[] args) {
        DemoClass abstractClass = new DemoClass();

        abstractClass.runner();

        /**
         * I want to access getVal method here
         */
        abstractClass.getVal(); // can do this here now
    }

    private class DemoClass extends DemoAbstractClass {

            private String val;

            @Override
            public void runner() {
                val = "test";
                System.out.println(val);
                this.run();
            }

            public String getVal() {
                return val;
            }
        }
    }
}
于 2012-06-14T15:48:37.613 に答える