在 Java 中解决覆盖抽象静态方法的问题?

Work around for overriding abstract static method in Java?

正在开发一个自定义的 JSON 转换器以符合公司标准(主要是为枚举添加许多标签和处理)。该转换器仅适用于具有 public nullary 构造函数的对象,因此它对那些由 Spring 增强的对象有一些问题,它必须通过如下方式解决: ((Advised) advised).getTargetSource().getTargetClass();

最终产品效果很好,但是导入 Spring 库会使它有点太大,我们决定有 2 个不同的 类,一个用于使用 [=31= 的项目] 而另一个则不是。

理想情况下,2 个转换器应如下所示:

JsonConverter.java

public class JsonConverter {
    // public static toObject(){...}
    // public static toJSON(){...}
    // other methods
    protected static resolveTargetClass(Object obj){return obj.getClass();}
}

SpringJsonConverter.java

public class SpringJsonConverter extends JsonConverter {
    protected static resolveTargetClass(Object obj){
        if(obj instanceof Advised)
            ((Advised) obj).getTargetSource().getTargetClass();
        return obj.getClass();
    }
}

众所周知,这行不通,因为 resolveTargetClass 是静态的,不可覆盖。有什么优雅的方法可以做到这一点吗?我想保持一切静态,因为这个转换器已经被许多项目使用并且修复它会花费很多时间。

说真的:不要在这里使用 static

static 导致 类 之间的紧密耦合,正如您自己认为的那样:它是 "kills" 多态性。从这个意义上说:它与良好做法相反。并非总是如此,但一旦它妨碍了您创建 good 设计的能力,static 显然是错误的方法。

因此:只需从当前代码中删除 static 关键字。是的,这将花费您 现在 。但它使您能够在将来做 正确 的事情。