为这些库函数提供接口的最佳方式是什么?
What's the best way to provide interface to these library functions?
我正在构建一个库包,它有一个接口 PropTransformer
,将由 30 多个 classes 实现。我在这里拿一个这样的 class 说 ShapeTransformer
public interface PropTransformer<T, R> {
R transform(T t);
T reverseTransform(R r);
}
public class ShapeTransformer implements PropTransformer<List<String>, Set<String>> {
@Override
public Set<String> transform(final List<String> list) {
// transform code
}
@Override
public List<String> reverseTransform(final Set<String> set) {
// reverseTransform code
}
}
这个库的classes方法显然可以使用new
运算符调用,但是由于很多转换可以在用户端完成,所以很多实例化会显得臃肿。类似于:
new ShapeTransformer().transform(...);
new TemperatureTransformer().transform(...);
...
我可以考虑创建一个实用程序 class Transformer
为转换器提供直接调用,例如
public class Transformer<T, R> {
private static ShapeTransformer shapeTransformer = new CompatibleDevicesTransformer();
public static Set<String> shapeTransform(final List<String> list) {
return shapeTransformer.transform(list);
}
public static List<String> shapeReverseTransform(final Set<String> set) {
return shapeTransformer.reverseTransform(set);
}
}
图书馆用户可以像这样使用它
Transformer.shapeTransform(...)
这种方法的问题:
- 它不会扩展,因为 Transformer class 将随着实现
PropTransformer
的转换器数量不断增长。
- 通过在
Transformer
class 中添加静态方法和变量来完成某种重复工作
有没有 cleaner/better 方法来完成这个?通过方法参考 and/or 功能接口,如果可能的话?
类似
Transformer t = new Transformer();
t.transform(ShapeTransformer::transform);
t.transform(TemperatureTransformer::transform);
(^ 这只是为了让您了解我正在寻找的内容。我不一定建议将 transformers 方法设为静态)
PropTransformer
不是功能接口,因为它包含不止 1 个抽象方法。所以,你不能使用lamda表达式来实现和调用这些方法。
您可以将 PropTransformer
拆分为功能接口 PropTransformer
和 PropReverseTransformer.
,但应根据 PropTransformer
如何融入整体设计来做出决定。
为了进一步减少客户端的样板代码,您可以创建 PropTransformerFactory
- 一个用于创建 PropTransformer
实现的实用程序。
伪代码:
public class PropTransformerFactory {
public static PropTransformer createShapeTransformer() {
return new ShapeTransformer();
}
public static PropTransformer createTemperatureTransformer() {
return new TemperatureTransformer();
}
}
我正在构建一个库包,它有一个接口 PropTransformer
,将由 30 多个 classes 实现。我在这里拿一个这样的 class 说 ShapeTransformer
public interface PropTransformer<T, R> {
R transform(T t);
T reverseTransform(R r);
}
public class ShapeTransformer implements PropTransformer<List<String>, Set<String>> {
@Override
public Set<String> transform(final List<String> list) {
// transform code
}
@Override
public List<String> reverseTransform(final Set<String> set) {
// reverseTransform code
}
}
这个库的classes方法显然可以使用new
运算符调用,但是由于很多转换可以在用户端完成,所以很多实例化会显得臃肿。类似于:
new ShapeTransformer().transform(...);
new TemperatureTransformer().transform(...);
...
我可以考虑创建一个实用程序 class Transformer
为转换器提供直接调用,例如
public class Transformer<T, R> {
private static ShapeTransformer shapeTransformer = new CompatibleDevicesTransformer();
public static Set<String> shapeTransform(final List<String> list) {
return shapeTransformer.transform(list);
}
public static List<String> shapeReverseTransform(final Set<String> set) {
return shapeTransformer.reverseTransform(set);
}
}
图书馆用户可以像这样使用它
Transformer.shapeTransform(...)
这种方法的问题:
- 它不会扩展,因为 Transformer class 将随着实现
PropTransformer
的转换器数量不断增长。 - 通过在
Transformer
class 中添加静态方法和变量来完成某种重复工作
有没有 cleaner/better 方法来完成这个?通过方法参考 and/or 功能接口,如果可能的话?
类似
Transformer t = new Transformer();
t.transform(ShapeTransformer::transform);
t.transform(TemperatureTransformer::transform);
(^ 这只是为了让您了解我正在寻找的内容。我不一定建议将 transformers 方法设为静态)
PropTransformer
不是功能接口,因为它包含不止 1 个抽象方法。所以,你不能使用lamda表达式来实现和调用这些方法。
您可以将 PropTransformer
拆分为功能接口 PropTransformer
和 PropReverseTransformer.
,但应根据 PropTransformer
如何融入整体设计来做出决定。
为了进一步减少客户端的样板代码,您可以创建 PropTransformerFactory
- 一个用于创建 PropTransformer
实现的实用程序。
伪代码:
public class PropTransformerFactory {
public static PropTransformer createShapeTransformer() {
return new ShapeTransformer();
}
public static PropTransformer createTemperatureTransformer() {
return new TemperatureTransformer();
}
}