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 完全分离(duh,愚蠢的我当然这就是它的工作原理)。

所以问题是。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 回答