将对象 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>
我想设计一个接口,用于将对象 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>