繁体   English   中英

存储和获取子类枚举的正确方法是什么?

[英]What's the correct way to store and get the enum of a child-class?

让我们假设我们正在处理一个“经典”代码示例:

我有类AnimalCatDogHorse和更多的动物。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM