将对象 A 转换为对象 B 的更好设计方法是什么?

What is the better design approach to convert object A to object B?

我想设计一个接口,用于将对象 A 转换为对象 B。 类似下面的片段 -

Interface IConverter<S, T> {
       T convertTo(S objectA);
}

但有时需要更多的外部输入参数才能获得对象B。 示例界面如下-

Interface IConverter<S, T> {
     T convertTo(S objectA, Map<String, Object> params);
}

现在使用第二种方法,当不需要额外的参数时,将 "null" 传递给第二个参数是一种开销。 当这些额外的参数通过 Map 传递时,我们就失去了编译时的类型安全性。 处理这种情况的更好方法是什么?

一种方法是在每个实现中将这些额外参数保留为 class 级别属性,并通过构造函数注入它。但这肯定会在转换器 classes 中引入状态管理。

先看看Guava 功能 class:

Function<S, T> converter = ...
final T t = converter.apply(s);

如果您的转换依赖于其他一些参数,您可以将它们传递给构造函数:

Function<S, T> converter = new MyConverter(Map params) {

  private Map params;

  MyConverter(Map params) {
    this.params = params;
  }

  T apply(S s) {
   ..
   // use your params and T object right here.
  }

};

然后就可以使用了,如下图:

Function<S, T> converter = getConverter(params);

Function<S, T> converter = getConverter();

然后

final T t = converter.apply(s);

您也可以将 S 参数 视为一个对象:

class ParamObject<S> {
    S data;
    Map params;
}

Function<ParamObject<S>, T>