为这些库函数提供接口的最佳方式是什么?

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(...)

这种方法的问题:

有没有 cleaner/better 方法来完成这个?通过方法参考 and/or 功能接口,如果可能的话?

类似

Transformer t = new Transformer();
t.transform(ShapeTransformer::transform);
t.transform(TemperatureTransformer::transform);

(^ 这只是为了让您了解我正在寻找的内容。我不一定建议将 transformers 方法设为静态)

PropTransformer 不是功能接口,因为它包含不止 1 个抽象方法。所以,你不能使用lamda表达式来实现和调用这些方法。

您可以将 PropTransformer 拆分为功能接口 PropTransformerPropReverseTransformer.,但应根据 PropTransformer 如何融入整体设计来做出决定。

为了进一步减少客户端的样板代码,您可以创建 PropTransformerFactory - 一个用于创建 PropTransformer 实现的实用程序。 伪代码:

public class PropTransformerFactory {
    public static PropTransformer createShapeTransformer() {
        return new ShapeTransformer();
    }

    public static PropTransformer createTemperatureTransformer() {
        return new TemperatureTransformer();
    }
}