跟踪超类中子类的所有实例

时间:2014-01-10 21:25:28

标签: java oop

我有以下,精简的Java代码:

// Class, in it's own file

import java.util.*;

public class Superclass {
    protected List<Subclass> instances = new ArrayList<>();

    public class Subclass extends Superclass {
        private int someField;

        public Subclass(int someValue) {
            this.someField = someValue;
            updateSuperclass();
        }

        private void updateSuperclass() {
            super.instances.add(this);
        }
    }
}

// Implementation, somewhere else, everything has been imported properly

Superclass big = new Superclass();
Subclass little1 = big.new Subclass(1);
Subclass little2 = big.new Subclass(2);
Subclass little3 = big.new Subclass(3);

我想在Superclass中实施一个方法来处理所有Subclass es。创建Subclass后,将自己添加到Superclass中的列表中,但每当我尝试在Superclass中遍历该列表时,它都会显示size是1.列表中的第一个元素(instances.get(0))只是吐出一个包含所有正确信息的String,但不是以对象形式,而不是单独的。就像我每次去add列表一样,它会以字符串形式附加到第一个(或零)元素。

如何解决这个问题,以便我可以保留ArrayList Subclass以便稍后循环并运行方法?我绝对是Java的初学者,这对我的情况没有帮助。

2 个答案:

答案 0 :(得分:2)

如果你需要的只是一个计数,那么我建议在父类的构造函数中更新一个静态值。

private static int instanceCount = 0;
public Constructor() {
    instanceCount++;
}

如果您绝对需要列表中的每个实例,以便您可以对它们执行某些操作,那么我建议您强烈重新考虑您的设计。

您始终可以创建一个实用程序类,使您可以维护要在其上运行进程的对象列表。这种方式更像是“面向对象”。您还可以创建一个包含所有操作的类,然后创建一个只包含数据值的更简单的bean类。

但是,如果你坚持,你仍然可以使用相同的技术。

private static List<SuperClass> list = new LinkedList<SuperClass>;
public Constructor() {
    list.add(this)
}

答案 1 :(得分:1)

每个实例都有自己的超类变量副本。

你想要做的是通过在它之前放置static关键字使变量“静态”。你可能甚至不需要超类完成你想要做的事情。