Допустим, у меня есть базовый / основной класс abstract: AbstractObject. AbstractObject расширен двумя классами: Object1 и Object2.
Эти два шаблона имеют много разных классов, которые также являются наследниками, например, Object3, Object4 и Object5 наследуются от Object1, а Object6, Object7 наследуются от Object2.
Я хочу, чтобы каждый отдельный класс (Object1, Object2, ..., Object7) имел счетчик, который подсчитывает количество созданных из него экземпляров.
Я думал, что могу использовать некоторую переменную public staticcounter, но я не уверен, как объявить ее в 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 {
...
}
Тем не менее, почему вы хотите подсчитывать экземпляры класса? Какую конкретную проблему вы пытаетесь решить?
Чтобы уточнить, вам нужен отдельный счетчик для каждого объекта (например, 3 Object1, 2Object2 и т. д.), А НЕ счетчик, который подсчитывает, сколько всего было создано каждого типа (например, 20 объектов)?
@JBNizet Точно, разные счетчики для каждого класса




I want ... to have a counter that counts the number of instances made of it.
Экземпляры - что означает «объекты, созданные для каждого класса»?
Если да, то используйте статическую карту. Например:
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
Да, и вы можете использовать абстрактный метод, который каждый класс должен будет реализовать, чтобы получить собственное количество записей из статической карты.
У вас должно быть статическое поле count в каждом классе. Если у нас есть статическое поле только в классе AbstractObject, оно НЕ будет унаследовано другим классам (потому что оно статическое).
Чтобы подсчитать количество объектов каждого класса, вы должны использовать «фабричный» метод (например, getNewInstance() в примере ниже).
public abstract class AbstractObject {
public static void main(String[] args) {
Object1 a = Object1.getNewInstance();
Object2 b = Object2.getNewInstance();
Object2 c = Object2.getNewInstance();
System.out.println("Number of Object1 instances = " + Object1.getCount());
System.out.println("Number of Object2 instances = " + Object2.getCount());
}
}
class Object1 extends AbstractObject {
private static int count;
private Object1() {
}
static Object1 getNewInstance() {
count++;
return new Object1();
}
static int getCount() {
return count;
}
}
class Object2 extends AbstractObject {
private static int count;
private Object2() {
}
static Object2 getNewInstance() {
count++;
return new Object2();
}
static int getCount() {
return count;
}
}
Вы не можете. У каждого класса должно быть собственное поле счетчика (почему оно должно быть публичным?). Или вы можете использовать один общий CountManager, который будет использовать некоторый Map <Class, Integer>, содержащий счетчик каждого класса.