我认为这段代码最重要的方面是Function
而不是方法本身。我也不认为切换您允许的子类是有意义的Function
身体,因为你已经知道什么类型Number
您想在当时返回Function
被建造。如果给出以下条件,您的方法会失败,这也有点问题:BigInteger.class
.
鉴于此,我要做的是创建一个实用程序类(我们称之为Numbers
)并提供方法,每个方法返回一个Function
(这可以是一个enum
单例)用于解析String
作为一种特定类型Number
。那是:
public class Numbers {
public static Function<String, Integer> parseIntegerFunction() { ... }
public static Function<String, Long> parseLongFunction() { ... }
...
}
它们都可以像这样实现:
public static Function<String, Integer> parseIntegerFunction() {
return ParseIntegerFunction.INSTANCE;
}
private enum ParseIntegerFunction implements Function<String, Integer> {
INSTANCE;
public Integer apply(String input) {
return Integer.valueOf(input);
}
@Override public String toString() {
return "ParseIntegerFunction";
}
}
然后可以根据用户的需要使用它:
List<String> strings = ...
List<Integer> integers = Lists.transform(strings, Numbers.parseIntegerFunction());
这种方法比你的方法有很多优点:
- 不需要任何切换
Function
...我们知道我们正在创建什么类型的数字,然后就这样做。快点。
- 更加灵活,因为每个
Function
可以在任何地方使用...用户不必像您的方法那样使用它(将转换后的值复制到ImmutableList
.
- 您只需创建
Function
你实际上想要允许。如果没有的话BigInteger
解析函数,用户无法调用它,而不是像在您的示例中那样在编译时执行此操作完全合法,然后在运行时失败。
作为旁注,我建议将任何返回类型的方法的返回类型设置为ImmutableList
be ImmutableList
而不是List
...它提供对该方法的客户有用的信息。
Edit:
If you 真的需要更动态的东西(即你想要有一些实例的类Class<T extends Number>
能够转变String
到那个Number
类型)您还可以添加一个查找方法,例如:
public static <T extends Number> Function<String, T> parseFunctionFor(Class<T> type) {
// lookup the function for the type in an ImmutableMap and return it
}
不过,这与您原来的方法有相同的问题,如果有Number
您没有提供的子类Function
为了。似乎在很多情况下这都不会有用。