【发布时间】:2020-10-15 18:49:08
【问题描述】:
我需要创建一系列将一个对象转换为另一个对象的转换器类。
它们的形式
class Transformer1 {
public static AnotherClass transform(MyClass source) {
return AnotherClass.newBuilder()
.setName(source.getName())
// etc
.build();
}
}
我有大约 15 个。
这些转换器现在假设参数不为空。否则我会得到一个 NullPointerException。
我想添加一个空检查,即:
class Transformer1 {
public static AnotherClass transform(MyClass source) {
if(source == null)
return null;
return AnotherClass.newBuilder()
.setName(source.getName())
// etc
.build();
}
}
但我不想在每个转换器类上都写这个空检查。我正在考虑将其放入超类或接口中。
abstract class BaseTransformer {
public static AnotherClass transform(MyClass source) {
return source == null ? null : transformNonNull(source);
}
public abstract AnotherClass transformNonNull(MyClass source);
}
我所有的子类都可以实现transformNonNull 方法。
现在这不起作用,因为我们正在处理静态方法,而transformNonNull 需要是静态的。但它不能是静态的和抽象的。
我可以让我的转换器非静态,但实际上它们没有状态并且更像是实用程序,所以我想让它们保持静态。
我过去已经遇到过这个问题,但并没有真正想出解决方案。这里最好的方法是什么?
编辑:
对象 A 具有字段 a1, a2, ... Ax 我想将其转换为具有字段 b1、b2、... bx 的对象 B
我的转换器是这些领域相互转化的转换器。
就我而言,a2 可以为空,这是完全可以接受的。如果a2 为空并且我无法从中构建b2,我不想通过异常。在这种情况下,我也想将 b2 设置为 null
【问题讨论】:
-
当参数为
null时抛出异常是一种合理的行为。相反,返回null仅意味着将其变成其他人的问题,在一个可能很难甚至不可能找出值开始位于null的地方。所以“最好的方法”是根本不做这个有问题的改变。 -
@Holger 我知道就转换器而言,最好假设它永远不会为空,但我需要在某处进行检查,因为空值在我的情况下是可以接受的并且应该被“转换” "为空。请参阅我的编辑。所以我只是将检查转移到调用中,说如果不为空则转换,否则设置为空
-
为什么这些转换器方法是静态的?为什么没有
interface Transformer<From, To>{ To transform(From input)}。然后,您可以让它们继承超类方法或使用静态辅助方法在分派到转换器之前进行空值检查。你现在如何调用你的 15 个不相关的静态方法?一个巨大的 if/else 链? -
“我可以让我的转换器非静态,但实际上它们没有状态并且更像是实用程序,所以我想让它们保持静态。”状态不是使用对象的唯一原因。另一个是动态调度,通过继承实现代码重用,接口和实现的解耦。
-
好的,伙计们,我想我会让它们成为非静态的,并拥有一个超类,它会让事情变得更容易。我正在使用 Spring,因此使它们成为单例很容易。感谢大家的意见。
标签: java inheritance java-8 null-check