Статическая переменная для каждого расширенного класса

Допустим, у меня есть базовый / основной класс 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 {
  ...
}

Вы не можете. У каждого класса должно быть собственное поле счетчика (почему оно должно быть публичным?). Или вы можете использовать один общий CountManager, который будет использовать некоторый Map <Class, Integer>, содержащий счетчик каждого класса.

JB Nizet 28.12.2018 18:24

Тем не менее, почему вы хотите подсчитывать экземпляры класса? Какую конкретную проблему вы пытаетесь решить?

JB Nizet 28.12.2018 18:27

Чтобы уточнить, вам нужен отдельный счетчик для каждого объекта (например, 3 Object1, 2Object2 и т. д.), А НЕ счетчик, который подсчитывает, сколько всего было создано каждого типа (например, 20 объектов)?

Stalemate Of Tuning 28.12.2018 18:29

@JBNizet Точно, разные счетчики для каждого класса

Yariv Levy 28.12.2018 18:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
552
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Да, и вы можете использовать абстрактный метод, который каждый класс должен будет реализовать, чтобы получить собственное количество записей из статической карты.

Gus 28.12.2018 19:29

У вас должно быть статическое поле 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;
  }
}

Другие вопросы по теме