【问题标题】:Counter of instances for a Class Tree类树的实例计数器
【发布时间】:2021-08-20 02:42:18
【问题描述】:

假设我们有一个类 Tree 如下: Class Animal, Class Dog extends Animal, Class Cat extends Animal.

当显然countAnimal = countDog + countCat 时,我们想要计算每个类的实例。

我们希望尽可能多地节省冗余代码。有没有一种优雅的方法可以为Animal Class 中的所有三个 Class 创建一个计数器?

【问题讨论】:

  • 您要的是可以计算任何一种类型的代码,还是可以一次性计算所有类型的代码?
  • 两者 - 所有人一份,每个孩子两份

标签: java class inheritance


【解决方案1】:

您可以使用如下代码计算集合中特定类型的所有实例:

public static <T extends Animal, U extends T> 
long countAnimalsByClass( Collection<T> animals, Class<U> cls ) {
    return animals.stream().filter( cls::isInstance ).count();
}

泛型 (T extends Animal) 允许将这一定义用于一组动物或一组猫或狗。

例如使用此代码:

Collection<Animal> animals = new ArrayList<>();
    
animals.add( new Cat());
animals.add( new Cat());
    
animals.add( new Dog());
animals.add( new Dog());
animals.add( new Dog());

System.out.println("# cats = " + countAnimalsByClass( animals, Cat.class));
System.out.println("# dogs = " + countAnimalsByClass( animals, Dog.class));
System.out.println("# animals = " + countAnimalsByClass( animals, Animal.class));

你得到:

# cats = 2
# dogs = 3
# animals = 5

如果有人添加新的子类,该函数无需修改即可工作:

animals.add( new Fish());
System.out.println("# fish = " + countAnimalsByClass( animals, Fish.class));
System.out.println("# animals = " + countAnimalsByClass( animals, Animal.class));

结果:

# fish = 1
# animals = 6

【讨论】:

  • 感谢安迪知道我们如何使用 Collection 来计算实例数。
【解决方案2】:

我将在动物类中为此使用一个静态变量,即狗类和猫类的父类。

Class Animal {
  private static int countInstance;
  //codes
  public Animal() {
    countInstance++;
  }
  //codes
  public static int getInstanceCount() {
    return countInstance;
  }
}

我们使用了一个计数器变量countInstance 来计算实例的数量,并将其保留为静态变量,以便所有实例的值都保持不变。

Class Dog extends Animal{ 
  private static int DogCount;
  public Dog() {
  DogCount++;
  System.out.println("Dog Instance Created");
  }
  public static int getDogCount(){
  return DogCount;
  }
}
Class Cat extends Animal{
  private static int CatCount;
  public Cat() {
  CatCount++;
  System.out.println("Cat Instance Created");
  }
  public static int getCatCount(){
  return CatCount;
  }
}

//驱动方法

Dog germanShephard = new Dog();
Cat BengalCat = new Cat();
System.out.println(BengalCat.getInstanceCount()); //Prints 2 
System.out.println(BengalCat.getCatCount() + germanShephard.getDogCount()); 
//Prints countAnimal = countDog + countCat

当你创建Dog、Cat类的对象时,父构造函数在子构造函数之前被调用,并且实例的计数器相应增加。

【讨论】:

  • 请注意,这会计算所有已创建的实例——不是所有现存的实例,或特定集合中的实例。另请注意,添加另一个子类会破坏动物计数代码。
猜你喜欢
  • 2012-04-28
  • 2020-09-15
  • 2011-08-21
  • 2020-07-21
  • 2017-02-26
  • 2023-03-03
  • 2022-06-29
  • 2011-08-04
  • 1970-01-01
相关资源
最近更新 更多