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