Załóżmy, że mam skomplikowanego mapera do wstrzyknięcia do jakiejś metody/konstruktora:
interface MyMapper <T>extends Function<String, T> {
}
lepiej tworzyć go tak:
class MyMapperMother implements MyMapper<Integer> {
private int multiplyBy;
public MyMapperMother (int multiplyBy) {
this.multiplyBy = multiplyBy;
}
@Override
public Integer apply() {
// ...
// ... skomplikowana implementacja
// ...
return result * multiplyBy;
}
}
i przekazywać tak:
// ...
builder.setMapper(new MyMapperMother(12))
// ...
czy tworzyć tak:
class MyMapperFactory {
public MyMapper<String, Integer> produceMapper(int multiplyBy) {
return x -> {
// ...
// ... skompliokwana implementacja
// ...
result * multiplyBy;
}
}
}
i przekazywać tak:
// ...
builder.setMapper(new MyMapperFactory.produceMapper(12))
// ...