提供的接口实现的最佳实践

时间:2018-12-18 21:34:45

标签: java oop interface

我正在用Java开发一个库,其中包含一些功能,其中某些值必须通过某些函数运行才能以某种方式进行转换或映射。如果您想了解更多细节,这是一个机器人库,需要在数学上更改一组电机输出水平。

当前,我实现此目标的方法是通过Mapper接口和map方法接受的run方法。用户这样使用它:

wheelValues.map(new Mapper() {
    @Override
    public double run(double input) { ••• }
});

问题是,为了方便用户,我想包括一些Mapper接口的默认实现,例如,绝对值Mapper。我想以某种方式使其成为Mapper接口的属性。静态内部类或静态公共字段是解决此问题的最佳方法是什么?

public interface Mapper {
    // This?
    static final Mapper ABS = new Mapper() {...}
    // Or this?
    static class Abs implements Mapper {...}
}

2 个答案:

答案 0 :(得分:0)

使API尽可能小。因此,请勿在静态方法或final字段足以满足需要的情况下添加额外的类。

enum会是一个错误的选择。例如,java.nio.file.StandardCopyOption

OTOH,如果使用枚举常量或静态字段,则不允许使用变化类型的参数,因此,如果仅出于一致性考虑,最好使用一种方法。例如,java.util.Collections.emptySetjava.util.stream.collectors.toSet

为了不创建太多实例,您可能希望在任何方法后面添加一个私有静态字段。

避免使用命名类Default或其他描述性较差的名称。即使它是默认方法返回的类。

答案 1 :(得分:0)

尽可能使用标准库接口;例如,您的Mapper似乎是DoubleFunction(或Function<Double, Double>)的副本。 Math.abs提供了绝对值,您已经可以使用Math::abs来引用它,不需要“默认实现”。

关于现成的实现问题,有两种常规类别:

  • 完全纯净的功能(没有旋钮或设置)通常在某处实现为常量。 String.CASE_INSENSITIVE_ORDER就是一个很好的例子,它是Comparator<String>的常数,其作用与名字一样。

  • 因为它们具有某种参数而需要私有副本的函数被实现为返回该函数接口实例的静态方法。这里的一个好例子是Predicate.isEqual(target),它返回一个Predicate(对象->布尔值)实例,如果检查的值等于目标值(创建实例时提供),则返回true。 1}}。