首页 > 解决方案 > 每个扩展类的静态变量

问题描述

假设我有一个基类/主abstract类:AbstractObject. AbstractObject由两个类扩展:Object1Object2.

这两个模板也有许多不同的类从它们扩展而来,例如,Object3Object4, 和Object5继承自Object1, ,Object6Object7继承自Object2

我希望每个单独的类(Object1, Object2, ..., Object7)都有一个计数器来计算由它组成的实例的数量。

我以为我可以使用一些public static变量counter,但我不确定如何在其中声明它AbstractObject,所以我的任何对象都不会复制代码。有什么想法吗?

abstract class AbstractObject {
  ...
  public static counter = ?
}

class Object1 extends AbstractObject {
  ...
}

class Object2 extends AbstractObject {
  ...
}

class Object3 extends Object1 {
  ...
}

class Object4 extends Object1 {
  ...
}

class Object7 extends Object2 {
  ...
}

标签: javainheritance

解决方案


我想要......有一个计数器来计算由它组成的实例数 。

实例 - 这意味着“为每个类实例化的对象”?
如果是,则使用静态地图。例如:

public class AbstractObject {

    private static Map<Class, Integer> map = Collections.synchronizedMap(new HashMap<>());

    public AbstractObject() {
        Class clazz = this.getClass();
        map.merge(clazz, 1, (x, y) -> x + y);
    }

    public static Map<Class, Integer> getCounters() {
        return Collections.unmodifiableMap(map);
    }
}

public class Object1 extends AbstractObject {
}

public class Object11 extends Object1 {
}

public class Object2 extends AbstractObject {
}

public class Object12 extends Object11{
}

现在:

public static void main(String[] args) {
    AbstractObject o1 = new Object1();
    o1 = new Object1();
    o1 = new Object2();
    o1 = new Object11();
    o1 = new Object11();
    o1 = new Object12();

    AbstractObject.getCounters().forEach((k, v) -> System.out.println(k + " ==> " + v));
}

给出这个结果:

class somepackage.Object11 ==> 2
class somepackage.Object12 ==> 1
class somepackage.Object1 ==> 2
class somepackage.Object2 ==> 1

推荐阅读