繁体   English   中英

Java - 一个变量可以是多值的枚举

[英]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.

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