在Java中重写抽象静态方法的变通方法?

在Java中重写抽象静态方法的变通方法?,java,static,overriding,abstract,utility,Java,Static,Overriding,Abstract,Utility,使用定制的JSON转换器以符合公司标准(基本上是添加许多标记并处理enum)。转换器仅适用于具有公共空构造函数的对象,因此它在使用Spring增强的对象时遇到了一些问题,必须通过以下方式解决: ((建议的)建议的).getTargetSource().getTargetClass() 最终的产品工作得很好,但是导入Spring库会使它有点太大,我们决定有两个不同的类,一个用于使用Spring的项目,另一个用于不使用Spring的项目 理想情况下,2个转换器应如下所示: JsonConverter

使用定制的JSON转换器以符合公司标准(基本上是添加许多标记并处理enum)。转换器仅适用于具有公共空构造函数的对象,因此它在使用Spring增强的对象时遇到了一些问题,必须通过以下方式解决:
((建议的)建议的).getTargetSource().getTargetClass()

最终的产品工作得很好,但是导入Spring库会使它有点太大,我们决定有两个不同的类,一个用于使用Spring的项目,另一个用于不使用Spring的项目

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

JsonConverter.java

public class JsonConverter {
    // public static toObject(){...}
    // public static toJSON(){...}
    // other methods
    protected static resolveTargetClass(Object obj){return obj.getClass();}
}
public class SpringJsonConverter extends JsonConverter {
    protected static resolveTargetClass(Object obj){
        if(obj instanceof Advised)
            ((Advised) obj).getTargetSource().getTargetClass();
        return obj.getClass();
    }
}
SpringJsonConverter.java

public class JsonConverter {
    // public static toObject(){...}
    // public static toJSON(){...}
    // other methods
    protected static resolveTargetClass(Object obj){return obj.getClass();}
}
public class SpringJsonConverter extends JsonConverter {
    protected static resolveTargetClass(Object obj){
        if(obj instanceof Advised)
            ((Advised) obj).getTargetSource().getTargetClass();
        return obj.getClass();
    }
}
正如大家都知道的,这不会起作用,因为
resolveTargetClass
是静态的,不可重写。有什么优雅的方法可以做到这一点吗?我想让一切保持静态,因为这个转换器已经被许多项目使用过,修复它会花费很多时间。

严肃地说:不要在这里使用静态

静态导致类之间的紧密耦合,正如您自己所想:它“杀死”多态性。从这个意义上说:这是良好做法的反面。不总是这样,但一旦它妨碍了您创建一个好的设计,静态显然是错误的方法


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

相关报道:我很欣赏这种快速的回归;-)我的公司提倡“每两次写一次”的做法,而不是尽可能干涸地工作,因为复制和粘贴在开始时非常便宜,即使是之后的维护也肯定是一种折磨:(如果可能的话,也可以使用这个静态的东西:例如,将
JsonConverter
声明为一个接口,并实现
JsonConverterFactory
,通过检查这个
对象obj
返回正确的impl,考虑到未来可能更明智