【问题标题】:java-outer separate class access anonymous classjava-outer 独立类访问匿名类
【发布时间】:2014-10-01 09:22:11
【问题描述】:

假设我有以下课程

Class0

public abstract class Class0 {

public Class0(){}
    public void abmethod1(){
        System.out.println("Abstract method 1");
    }

    public void abmethod2(){
        System.out.println("Abstract method 2");
    }
}

Class1

public class Class1 {
    private List<Integer> aList;

    public Class1(){
        this.aList= new ArrayList<>();
    }

    public Integer getElementAt(int i){
        return this.aList.get(i);
    }

    public int getSize(){
        return this.aList.size();
    }

    public void add(int num){
        this.aList.add(num);
    }
}

Class2

public class Class2 {
    private Class0 c0; 
    private Class3 c3;
    public Class2(){
        this.c0 = new Class0() {
            Class1 c1 = new Class1();

            @Override
            public void abmethod1(){
                System.out.println("Abstract method 1 called. Size is " + c1.getSize());
            }

            @Override
            public void abmethod2(){
                c1.add(1);
                c1.add(2);
                c1.add(3);
                System.out.println("Abstract method 2 called. Size is " + c1.getSize());
            }
       };
       this.c3 = new Class3();
       c3.methodc2(c0);
    }
}

Class3

public class Class3{
    public void methodc2(Class0 c0){
       c0.abmethod1();
       c0.abmethod2();
    }
}

Class4

public class Class4 {
    private Class2 c2;

    public Class4(){
        c2 = new Class2();
    }  
}

Class5

public class Class5 {
    private Class2 c2;

    public void method2(){
        this.c2 = new Class2();
    }
}

然后我运行主类

public class Class6 {
    public static void main(String[] afg){
        Class4 c4 = new Class4();
        Class5 c5 = new Class5();
        c5.method2();
    }
}

我收到了消息

Abstract method 1 called. Size is 0
Abstract method 2 called. Size is 3
Abstract method 1 called. Size is 0
Abstract method 2 called. Size is 3

所以我想在每次调用 Class3 中的匿名类时获取我的列表的最后一个大小(这里是 3)。如何防止它创建Class0的新实例,以便获取输出

Abstract method 1 called. Size is 0
Abstract method 2 called. Size is 3
Abstract method 1 called. Size is 3
Abstract method 2 called. Size is 6

提前谢谢你

【问题讨论】:

  • 如果您更习惯性地缩进代码,这将真正有所帮助...缩进所有方法。 (我已经为您完成了,但以后请多注意格式化自己。)
  • 对不起,我不知道你想如何缩进..是不是空格和样式有问题...?
  • 比较它现在的样子和我编辑之前的样子。如果您使用的是为您执行任何缩进的 IDE,我非常怀疑您是否在类声明下直接有方法声明,它们是它们的一部分,没有缩进...

标签: java anonymous-class anonymous-inner-class


【解决方案1】:

如果您的目标是Class2 的所有实例共享同一个Class0 实例,则可以通过将Class2c0 成员设为静态来实现。在这种情况下,您将在静态初始化块中而不是在构造函数中初始化 c0 变量。

public class Class2 {
    private static Class0 c0; 
    private Class3 c3;
    static 
    {
         Class2.c0 = new Class0() {
            Class1 c1 = new Class1();

            @Override
            public void abmethod1(){
                System.out.println("Abstract method 1 called. Size is " + c1.getSize());
            }

            @Override
            public void abmethod2(){
                c1.add(1);
                c1.add(2);
                c1.add(3);
                System.out.println("Abstract method 2 called. Size is " + c1.getSize());
            }
        };
    }
    public Class2(){
       this.c3 = new Class3();
       c3.methodc2(c0);
    }
}

如果不知道代码的用途,很难说这一切是否有意义。

【讨论】:

  • 嗯,它更复杂。我有一个 JTable,每次单击单元格时,我都想将单元格坐标放入列表中。之后,我按下一个按钮并用颜色为这些单元格着色。但我不能着色,因为我的列表大小为 0! :-)
猜你喜欢
  • 2010-11-08
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
相关资源
最近更新 更多