[英]What's the correct way to store and get the enum of a child-class?
让我们假设我们正在处理一个“经典”代码示例:
我有类Animal
, Cat
, Dog
, Horse
和更多的动物。 Animal
是所有动物都扩展的抽象 class。
此外,我还有枚举AnimalType
:
public enum AnimalType {
CAT, DOG, HORSE, ...
}
这是需要使用此类枚举的场景。 我知道实例测试和强制转换,并且更喜欢使用它来通过枚举进行识别。 但这里需要它,所以如果可能的话,请不要把它变成关于那个的辩论。
问题:
以下哪项是 go 和/或更高效性能的正确方法?:
一个)
public abstract class Animal {
@Getter private final AnimalType type;
public Animal(AnimalType type) {
this.type = type;
}
}
或者
b)
public abstract class Animal {
public Animal() {
}
public abstract AnimalType getType();
}
public class Cat extends Animal {
@Override
public AnimalType getType() {
return AnimalType.CAT;
}
}
换句话说:我应该将子 class 的枚举存储在父抽象 class 的成员中还是让它从抽象方法“准静态”返回?
我更喜欢方法 a):将enum
存储在基础 class 中,并为其提供最终的getter
。 第二种方法不会强制getType()
总是返回真实的动物类型,因为实现可能如下所示:
public class DraftAnimal extends Animal
{
…
@Override
public final AnimalType getType()
{
// DO NOT DO THIS!
return today.equals( christmas ) ? AnimalType.REINDEER : AnimalType.HORSE;
}
}
坦白说,样品看起来很傻……但你想直接从设计中阻止那些愚蠢的想法。
好吧,我认为在这种情况下你不应该关心性能,因为你的对象的 memory 足迹和调用 getter 的成本可能是相同的(非常便宜)。
一旦您使用具有一些常见功能的抽象 class,我建议您使用方法 b) 以与代码的 rest 保持一致(如果我们只有您建议的这两个选项)。
或者,您可以在抽象 class 中protected final
字段以及吸气剂。 像这样的东西:
public abstract class Animal {
@Getter protected final AnimalType type;
public Animal(AnimalType type) {
this.type = type;
}
}
public class Cat extends Animal {
public Cat() {
super(AnimalType.CAT);
}
}
这种方法将所有通用代码封装在抽象 class 中,但需要在继承类的构造函数中显式传递类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.