【发布时间】:2022-01-16 02:40:44
【问题描述】:
考虑以下表示实体的类,并具有返回 EnumA
类型数据的方法EntityA 类:
public class EntityA
{
public Set<EnumA> getProcessedFlags() { ... }
}
枚举:
public enum EnumA {
READ_ONLY,
READ_WRITE,
PERMISSION_DENIED,
COMMENT_ENABLED
}
现在我需要再添加一个EntityB,它类似于EntityA,但逻辑上有所不同。 (相同的方法签名但不同的实现:
还有一件事,EntityA中的EnumA的返回值是EntityB的**EnumB。
EnumA 和 EnumB 是两个不同的集合,它们代表逻辑上相同标志的集合,但每个标志都有一些独占的值:
枚举B
public enum EnumB {
READ_ONLY,
READ_WRITE,
LIKE_ENABLED
}
所以为了重构它,我创建了一个抽象基类 - EntityBase,并创建了 EntityA 和 EntityB,作为这个基类的子类.
问题是枚举不可扩展,有没有好的方法来重构它?
我想创建如下所示的类结构:
public enum EnumBase {}
public enum EnumA extends EnumBase {}
public enum EnumB extends EnumBase {}
public abstract class EntityBase
{
public Set<? extends EnumBase> getProcessedFlags();
}
public class EntityA extends EntityBase
{
public Set<EnumA> getProcessedFlags() { ... }
}
public class EntityB extends EntityBase
{
public Set<EnumB> getProcessedFlags() { ... }
}
既然 java 中的枚举是不可扩展的,我们能不能有更好的设计来维护这个 EntityBase 类?
【问题讨论】:
-
考虑过独占使用类的可能性吗?即完全避免枚举?另外,由于 EntityA 和 EntityB 的标志是通用的,我们可以将标志与实体分开,只需要跟踪它的组合,可能使用 Set?另请注意,枚举作为区分“类型”的一种方式具有 C/C++ 风味!
-
主要问题是这个 Enum 已经在很多地方被用作 Enum。完全分离实体和枚举,绝对是一个解决方案。但它会随着添加更多类似的实体和枚举而扩展吗?
标签: java class oop enums refactoring