代码之家  ›  专栏  ›  技术社区  ›  ranjan_purbey

有没有办法在Java中模仿Ruby中的类实例变量概念?

  •  0
  • ranjan_purbey  · 技术社区  · 7 年前

    假设我有一个动物类和它的两个子类,即Dog&猫我想记录Dog和Cat类的实例数(例如,{Dog:3,Cat:1})。

    class Animal{
      static int instances = 0;
      public Animal(){
        instances++;
      }
    }
    

    我可以用 Animal.instances 数一数所有的动物。但是,我想分别计算每种动物的数量。如何在不重复所有子类的构造函数中的相同代码的情况下实现这一点?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Michael    7 年前

    不要依赖于静力学或力学 reflexively checking the class name

    interface AnimalFactory<T extends Animal>
    {
        T create();
    }
    
    interface CountingAnimalFactory<T extends Animal> extends AnimalFactory<T>
    {
        int numberOfAnimals();
    }
    
    public class CountingDogFactory implements CountingAnimalFactory<Dog>
    {
        private int numberOfDogs;
    
        public Dog create() {
            numberOfDogs++;
            return new Dog();
        }
    
        public int numberOfAnimals() {
             return numberOfDogs;
        }
    }
    

    您可以为 Dog 和 Cat

        2
  •  1
  •   ernest_k Petronella    7 年前

    您可以维护地图:

    class Animal {
    
        static Map<String, Long> counts = new HashMap<>();
    
        public Animal() {
            counts.compute(this.getClass().getName(), 
                    (s, old) -> old == null ? 1 : old + 1);
        }
    }
    

    如果你预见到了比赛的情况,那么你可能应该 counts ConcurrentHashMap

        3
  •  0
  •   Dakshinamurthy Karra    7 年前

    类似这样的事情可能会有所帮助:

    class Animal {
        static Map<Class, Integer> instances = new HashMap<>();
    
        public Animal() {
            if (instances.get(this.getClass()) == null)
                instances.put(this.getClass(), 0);
            instances.put(this.getClass(), instances.get(this.getClass()) + 1);
        }
    }
    

    instances.get(Cat.class) .