【发布时间】:2020-07-19 02:01:30
【问题描述】:
我正在尝试编写一个实用程序类,它可以接收String 和Class<?> 并返回一个Object,它实际上是String 的类型化实例。
例如,如果我有字符串"FALSE" 和类"java.lang.Boolean",我想返回键入的Boolean.FALSE。其他类如 String、Long、Int、Enum 等。
我想以一种在添加新类型时不需要太多重写的方式来执行此操作。目前我有一个签名Object getTypedValue(Class<?> clazz, String value);的方法。
从这里开始,我想我可以使用Map<Class<?>, Function<String, Object>>。这适用于 String 和 Boolean 等情况,但对于 Enum 情况,我也需要类名。所以地图变成Map<Class<?>, BiFunction<String, Class<?>, Object>>。
但是大部分方法不需要Class参数。还发现了一个新的FunctionalInterface,比如:
@FunctionalInterface
public interface OptionalClassFunction<T, CLAZZ, R> {
R apply(T t, CLAZZ... clazz);
}
当我传递一个只有 T 作为 lambda 的方法时,似乎不起作用。
例如
ImmutableMap.of(
Boolean.class, Util::toBoolean
)
private Boolean toBoolean(String value);
不起作用。
关于如何做的任何建议,例如:
Map<Class<?>, WhateverFunction<String, MAYBE_A_CLASS, Object>> ?
示例方法是:
public static Boolean toBoolean(String value) {
// derive bool
}
public static Enum toEnum(String value, Class<?> fieldType) {
// derive enum
}
【问题讨论】:
-
系统中的枚举数量不是有限的;这是一个用于大型生态系统的库,注册了数千个枚举。假设我们有
DayOfTheWeek、Month、AstrologicalSign等。然后用toEnum("AUGUST",Month.class)调用这个方法toEnum -
我看不出
Util.toEnum("AUGUST", Month.class)和Month.valueOf("AUGUST")之间的区别,除了第一个更长,需要一个本土方法,并且如果分配给Month变量需要一个强制转换,而第二个更短、内置且类型安全。 -
啊。也许我解释错了。该类派生自一个字符串并试图被序列化。所以我们必须这样做:Class> clazz = Class.forName(“Month.class”)。如果有一种更简洁的方法可以将 ad-hoc 字符串转换为这个 ad-hoc 类,我很乐意使用本机方法
-
这个问题是XY problem。您正在寻找一种将
Enum.class映射到解析器的方法,但即使您解决了这个问题,它也对您不起作用,因为您不会查找Enum.class,您会查找例如DayOfWeek.class,因此找不到解析器。 --- 后退一步,然后问你的 real(新)问题,即你有例如"java.lang.Integer", "42"作为输入并想要一个Integer(42)对象作为结果,或者"java.time.DayOfWeek", "MONDAY"作为输入并想要一个DayOfWeek.MONDAY对象。 -
这是公平的。会做。谢谢@Andreas。
标签: java design-patterns functional-programming functional-interface