如何解决为这些库函数提供接口的最佳方法是什么?
我正在构建一个库包,它具有一个接口PropTransformer
,该接口将由30多个类实现。我在这里上一堂这样的课程,说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
}
}
显然可以使用new
运算符来调用该库的类方法,但是由于可以在用户端进行很多转换,因此很多实例化显得appear肿。像这样:
new ShapeTransformer().transform(...);
new TemperatureTransformer().transform(...);
...
我可以考虑创建一个实用程序类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类将随着实现
PropTransformer
的变压器数量的增长而持续增长。 - 通过在
Transformer
类中添加静态方法和变量来完成各种重复工作
是否有一种更清洁/更好的方法来实现这一目标?通过方法参考和/或功能接口,如果可能的话?
类似
Transformer t = new Transformer();
t.transform(ShapeTransformer::transform);
t.transform(TemperatureTransformer::transform);
(^这只是为了窥视我要寻找的内容。我不一定要建议将Translators方法设为静态)
解决方法
PropTransformer
不是功能接口,因为它包含多个抽象方法。因此,您无法使用lamda表达式来实现和调用这些方法。
您可以将PropTransformer
拆分为功能接口PropTransformer
和PropReverseTransformer.
,但决策应基于PropTransformer
如何适合整体设计。
要进一步减少客户端的样板代码,可以创建PropTransformerFactory
-一种用于创建PropTransformer
实现的实用程序。
伪代码:
public class PropTransformerFactory {
public static PropTransformer createShapeTransformer() {
return new ShapeTransformer();
}
public static PropTransformer createTemperatureTransformer() {
return new TemperatureTransformer();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。