尝试在 groovy 中编写通用枚举实用程序 class
Trying to write a generic enum util class in groovy
问题
我们有多个枚举类型,其中有一些 public static EnumType valueOfText(String text)
,用于将数据文件单元格的内容映射到枚举。
我正在尝试编写一个通用枚举实用程序,它采用逗号分隔的字符串和 return 多个枚举值。例如,我们有以下枚举:
public enum Frequency {
SEMI_ANNUAL("S"), MONTHLY("M"), QUARTERLY("Q"), ANNUAL("A")
public final String textValue;
public Frequency(String textValue) {
this.textValue = textValue;
}
public static Frequency valueOfText(String textValue) {
for (Frequency frequency : values()) {
if (frequency.textValue.equals(textValue))
return frequency;
}
return null;
}
}
和我们要转换为 [Frequency.ANNUAL, Frequency.SEMI_ANNUAL]
的字符串 "A,S"
。
尝试的解决方案
我像这样创建了一些 EnumUtils
:
import java.util.stream.Collectors
public final class EnumUtils {
public static final String LIST_SEPARATOR = ",";
public static <E extends Enum<E>> List<E> CreateFromText(String text) {
List<String> textList = text.split(this.LIST_SEPARATOR)
return textList.stream()
.map { txt ->
E.valueOfText(txt)
}
.collect(Collectors.toList())
}
}
上述解决方案后会发生什么
我们去使用它,像这样:
EnumUtils.CreateFromText<Frequency>(row[3])
和IDE马上就<>
.
抱怨
我们如何在其中指定枚举类型?
在 Groovy 中,如果您传递实际 Class
而不是仅使用类型参数,则可以做到这一点。
enum Frequency {
SEMI_ANNUAL("S"), MONTHLY("M"), QUARTERLY("Q"), ANNUAL("A")
final String textValue;
Frequency(String textValue) {
this.textValue = textValue;
}
static Frequency valueOfText(String textValue) {
return values().find { it.textValue == textValue }
}
}
final class EnumUtils {
static <E extends Enum<E>> List<E> createFromText(Class<E> clazz, String text) {
return text.split(",").collect { clazz.valueOfText(it) }
}
}
EnumUtils.createFromText(Frequency, "S,M")
同样的想法在 Java 中行不通,因为 clazz
在编译时不会有 valueOfText
。
也许 Util class 并不能为您节省很多打字时间:
"S,M".split(",").collect(Frequency.&valueOfText)
问题
我们有多个枚举类型,其中有一些 public static EnumType valueOfText(String text)
,用于将数据文件单元格的内容映射到枚举。
我正在尝试编写一个通用枚举实用程序,它采用逗号分隔的字符串和 return 多个枚举值。例如,我们有以下枚举:
public enum Frequency {
SEMI_ANNUAL("S"), MONTHLY("M"), QUARTERLY("Q"), ANNUAL("A")
public final String textValue;
public Frequency(String textValue) {
this.textValue = textValue;
}
public static Frequency valueOfText(String textValue) {
for (Frequency frequency : values()) {
if (frequency.textValue.equals(textValue))
return frequency;
}
return null;
}
}
和我们要转换为 [Frequency.ANNUAL, Frequency.SEMI_ANNUAL]
的字符串 "A,S"
。
尝试的解决方案
我像这样创建了一些 EnumUtils
:
import java.util.stream.Collectors
public final class EnumUtils {
public static final String LIST_SEPARATOR = ",";
public static <E extends Enum<E>> List<E> CreateFromText(String text) {
List<String> textList = text.split(this.LIST_SEPARATOR)
return textList.stream()
.map { txt ->
E.valueOfText(txt)
}
.collect(Collectors.toList())
}
}
上述解决方案后会发生什么
我们去使用它,像这样:
EnumUtils.CreateFromText<Frequency>(row[3])
和IDE马上就<>
.
我们如何在其中指定枚举类型?
在 Groovy 中,如果您传递实际 Class
而不是仅使用类型参数,则可以做到这一点。
enum Frequency {
SEMI_ANNUAL("S"), MONTHLY("M"), QUARTERLY("Q"), ANNUAL("A")
final String textValue;
Frequency(String textValue) {
this.textValue = textValue;
}
static Frequency valueOfText(String textValue) {
return values().find { it.textValue == textValue }
}
}
final class EnumUtils {
static <E extends Enum<E>> List<E> createFromText(Class<E> clazz, String text) {
return text.split(",").collect { clazz.valueOfText(it) }
}
}
EnumUtils.createFromText(Frequency, "S,M")
同样的想法在 Java 中行不通,因为 clazz
在编译时不会有 valueOfText
。
也许 Util class 并不能为您节省很多打字时间:
"S,M".split(",").collect(Frequency.&valueOfText)