所以这就是场景。
我有一个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子句,那么它按预期工作
答案 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”。为什么不只是有一个方法来增加对象本身的字段?