Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类树的实例计数器_Java_Class_Inheritance - Fatal编程技术网

Java 类树的实例计数器

Java 类树的实例计数器,java,class,inheritance,Java,Class,Inheritance,假设我们有一个类树,如下所示: 类动物,类狗扩展动物,类猫扩展动物 我们要计算每个类的实例,显然countAnimal=countDog+countCat 我们希望尽可能地节省冗余代码。是否有一种优雅的方法来为动物类中的所有三个类创建计数器?我将在动物类中使用一个静态变量,即类Dog和类Cat的父类 Class Animal { private static int countInstance; //codes public Animal() { countInstance+

假设我们有一个类树,如下所示:
类动物
类狗扩展动物
类猫扩展动物

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


我们希望尽可能地节省冗余代码。是否有一种优雅的方法来为
动物
类中的所有三个类创建计数器?

我将在动物类中使用一个静态变量,即类Dog和类Cat的父类

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类在子构造函数之前调用父构造函数,实例计数器相应增加。

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

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

# 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

您要的是可以计算任何一种类型的代码,还是可以在一次过程中计算所有类型的代码?两者都是-一个用于所有类型,两个用于每个子类型。注意,这会计算所有已创建的实例,而不是所有现有实例或特定集合中的实例。还要注意的是,动物计数代码由于添加了另一个子类而被破坏。感谢Andy了解了如何使用Collection计算实例。
# fish = 1
# animals = 6