1

それではシナリオです。

クラス A があり、クラスの呼び出し方法に応じて、そのメソッドのいくつかの動作が異なるようにしたいと考えています。

私が今やったことは次のようなものです:

interface Interface{
  public void someMethod();
}

class A{
  int variable;
  Interface getA1(){
    return new A1();
  }
  Interface getA2(){
    return new A2();
  }
  class A1 extends A implements Interface{
    public void someMethod(){
       variable++;
    }
  }
  class A2 extends A implements Interface{
    public void someMethod(){
       variable--;
    }
  }
}

ここでの問題は、getA1() または getA2() が呼び出されると、実際には A1 または A2 の完全に新しいインスタンスが返されることです。ここで、int 変数は親クラス A とは完全に分離されています (まあ、愚かな私もちろん、それがどのように機能するかです)。

そこで質問です。javaで、メソッドを介して外部クラス内のデータを変更できるある種の内部クラスを返すことは可能ですか?

重要なことは、そのインターフェイスを作成するために使用されたメソッドに応じて、その単一のクラスをさまざまな方法で変更するインターフェイスを返すことができる単一のクラスを持つことです。

ここで単純なことを見落としている可能性があります。申し訳ありませんが、困惑しています。:(

編集:それを説明するより良い方法は、ローカル変数、サブクラス(または別のクラス)に直接アクセスし、元のクラスに他のクラスを作成できるメソッドを持ちたいと思うことです。

EDIT2: getA1()/getA2() のときに別のインスタンスを作成した理由は、おそらくクラス A1 と A2 が A を拡張するように宣言されたためです。 extends 句を削除すると、期待どおりに動作するようです。

4

2 に答える 2

1

はい、匿名クラスでできます。

interface Interface{
  public void someMethod();
}

public class A {
    int variable;

    Interface getA1() {
        return new Interface() {
            @Override
            public void someMethod() {
                variable++;
            }
        };
    }
}

ただし、これは、より簡潔ではありますが、非静的内部クラスを宣言することと同等であることに注意してください。

于 2012-05-03T23:53:50.323 に答える
1

まず第一に、あなたの内部クラスが外部クラスを拡張しているのは非常に奇妙です。それを行う正当な理由が思い浮かびませんし、それが何をするのか正確にはわかりません。

それに加えて、私はあなたの問題を理解していません。すべての内部クラスは、親クラスのフィールドにアクセスできます。たとえば、次のようになります。

public class Tester {
  private int myInt;

  public InnerTester getInnerTester() {
    return new MyInnerTester();
  }

  public InnerTester getOtherInnerTester() {
    return new OtherInnerTester();
  }

  public interface InnerTester {
    public void doStuff();
  }

  public class MyInnerTester implements InnerTester{
    @Override
    public void doStuff() {
      myInt++;
    }   
  }

  public class MyOtherInnerTester implements InnerTester {
    @Override
    public void doStuff() {
     myInt++;
    }
  }

  public static void main(String[] args) {
    Tester tester = new Tester();
    System.out.println("Before: " + tester.myInt);
    tester.getInnerTester().doStuff();
    tester.getOtherInnerTester().doStuff();
    System.out.println("After: " + tester.myInt);
  }   
}

出力:

Before: 0
After: 2

ただし、これはすべてかなり怪しいようです。なぜこの振る舞いを利用したいのか正確にはわかりません。以前にアクション リスナーで同様のことを行ったことがありますが、その親オブジェクトを「ActionListenerFactory」と正確に呼ぶことはしません。オブジェクト自体のフィールドをインクリメントするメソッドを用意しないのはなぜですか?

于 2012-05-04T00:06:03.350 に答える