[英]Java - enum where one variable can be multi-valued
我有一个如下所示的枚举。 直到最近,所有变量都是单值的。 但是,现在 TYPE4 可以具有三个可接受的值之一。 我希望简单地修改此枚举以适应 TYPE4,但考虑可能只有一种多值类型意味着我需要使用 object 进行映射而不是枚举。 我将不胜感激任何见解。 谢谢你。
public enum Record {
TYPE1("TYPE1"),
TYPE2("TYPE2"),
TYPE3("TYPE3"),
TYPE4_MULTI(TYPE_A or TYPE_B or TYPE_C);
private final String value;
public static final Map<Record, String> enumMap = new EnumMap<Record, String>(
Record.class);
static {
for (Record e : Record.values())
enumMap.put(e, e.getValue());
}
Record(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
在操作上,我在工厂 class 中使用此枚举来确定我应该实例化 4 种类型的子类中的哪一种。 我通过让每个子类都知道自己的类型来做到这一点,如下所示:
@Override
public String getType() {
return Record.TYPE1.getValue();
}
,然后工厂 class 预先构建了一组这样的子类:
@Component
public class RecordProcessorFactory {
@Autowired
public RecordProcessorFactory(List<RecordProcessor> processors) {
for (RecordProcessor recordProcessor : processors) {
processorCache.put(recordProcessor.getType(), recordProcessor);
}
}
private static final Map<String, RecordProcessor> processorCache = new HashMap<String, RecordProcessor>();
public RecordProcessor getSyncProcessor(String type) {
RecordProcessor service = processorCache.get(type);
if(service == null) throw new RuntimeException("Unknown service type: " + type);
return service;
}
}
您可以使用 String 数组来存储多个值,请注意您的逻辑可能会随着enumMap
的变化而改变。
public enum Record {
TYPE1("TYPE1"),
TYPE2("TYPE2"),
TYPE3("TYPE3"),
TYPE4_MULTI("TYPE_A", "TYPE_B", "TYPE_C");
private final String[] values;
public static final Map<Record, String[]> enumMap = new EnumMap<Record, String[]>(Record.class);
static {
for (Record e : Record.values())
enumMap.put(e, e.getValues());
}
Record(String... values) {
this.values = values;
}
public String[] getValues() {
return values;
}
}
如果您需要从String
值中获取Enum
,您可以添加此 static 方法:
public static Optional<Record> optionalValueOf(final String value) {
for (Record record : values()) {
for (String recordValue : record.values) {
if (null == value && null == recordValue || value.equals(recordValue)) {
return Optional.of(record);
}
}
}
return Optional.empty();
}
我认为最好将值封装在枚举中。 它应该是不可变的(数组不是不可变的数据存储)。
@lombok.Getter
public enum Record {
TYPE1("TYPE1"),
TYPE2("TYPE2"),
TYPE3("TYPE3"),
TYPE4_MULTI("TYPE_A", "TYPE_B", "TYPE_C");
// immutable list
private final List<String> values;
Record(String... values) {
this.values = Arrays.stream(values)
.collect(Collectors.toList());
}
}
PS Map<Record, String> enumMap
我认为是没用的,因为你已经有一个Record
而你只需要调用record.getValues()
而不是Record.enumMaps.get(record)
。 此外,这破坏了 OOP 封装。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.