创建内部类,可以完全访问外部类的局部变量

时间:2012-05-03 23:45:25

标签: java oop

所以这就是场景。

我有一个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完全分开(duh,傻我当然这是怎么回事)。

所以问题是。是否有可能在java中返回某种内部类,允许您通过它的方法修改外部类中的数据?

关键是拥有一个可以返回以不同方式修改该单个类的接口的类,具体取决于用于创建该接口的方法。

我可能会在这里忽略一些简单的事情,对不起,但这让我很难过! :(

编辑:我认为更好的解释方法是 - 我想直接访问局部变量,子类(或另一个类),并在原始类中创建一个可以创建另一个的方法类。

EDIT2:它在getA1()/ getA2()时创建一个单独的实例的原因很可能是因为类A1和A2被声明为扩展A.似乎如果删除了extends子句,那么它按预期工作

2 个答案:

答案 0 :(得分:1)

是的,匿名课会这样做。

interface Interface{
  public void someMethod();
}

public class A {
    int variable;

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

应该指出的是,这相当于声明非静态内部类,虽然更简洁。

答案 1 :(得分: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”。为什么不只是有一个方法来增加对象本身的字段?