首页 > 解决方案 > 如何考虑超类中静态方法的行为?

问题描述

我需要创建一系列将一个对象转换为另一个对象的转换器类。

它们的形式

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如果为 null 并且我无法从中构建,我不想通过异常b2。在这种情况下,我也想设置b2为 null

标签: javainheritancejava-8null-check

解决方案


您可以使用 AspectJ 将空检查插入到相关方法中。


推荐阅读