Java 使用枚举避免类型比较

Java 使用枚举避免类型比较,java,enums,type-conversion,Java,Enums,Type Conversion,我正在构建一些需要利用多态性的东西,我想知道这种避免类型比较的方法有什么缺陷 本质上,我希望在基类中放置一个枚举,然后根据当前类的类型更改该枚举的值,然后使用该枚举进行类型比较 因此,对于施工人员: public class Animal{ private AnimalType animalType; // the enum public Animal(AnimalType animalType) { this.animalType = animalTy

我正在构建一些需要利用多态性的东西,我想知道这种避免类型比较的方法有什么缺陷

本质上,我希望在基类中放置一个枚举,然后根据当前类的类型更改该枚举的值,然后使用该枚举进行类型比较

因此,对于施工人员:

public class Animal{
    private AnimalType animalType; // the enum

    public Animal(AnimalType animalType)
    {
        this.animalType = animalType;
    }

    public getAnimalType()
    {
        return animalType;
    }
}

public class Cat{
    public Cat()
    {
        super(AnimalType.CAT);
    }
}

public class Dog{
    public Dog()
    {
        super(AnimalType.DOG);
    }
}
而不是:

 if (dog instanceof Dog)
我们:

 if (dog.getAnimalType() == AnimalType.DOG)
那么这会对计算速度产生影响吗?在这样做的时候,你能想到哪些缺陷?当我提出这一点时,我个人是否错过了一些重要的东西


我知道出于各种原因,这并不完美,但如果每秒要执行数千次这样的比较,那么减少几微秒是值得的。

这可能比
instanceof
快一点,但这不是使用它的好理由,除非你已经证明(通过基准测试)它确实对您的应用程序产生了重大影响。否则,重要的因素是可维护性、可读性、可用性、可扩展性等,这些因素可能不会产生任何显著的影响。但是维护任务可能略有不同(对于enum,需要维护一个额外的单元),
AnimalType
enum需要在每次创建
Animal
的新子类时进行维护。即使每秒进行数千次比较,性能差异也可能可以忽略不计。更重要的是,这两种方法并不相同。如果
Dog
获得子类,子类是否获得自己的枚举?此外,继承的一个基本假设是父类不需要知道子类。您没有设置每次扩展父类时都必须对其进行更改。请参见此处: