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

时间:2017-10-10 09:37:11

标签: java static override abstract utility

使用自定义JSON转换器以符合公司标准(基本上添加许多标签并处理枚举)。转换器仅适用于具有公共nullary构造函数的对象,因此它对Spring增强的那些对象有一些问题,它必须通过以下方式解决: ((Advised) advised).getTargetSource().getTargetClass();

最终产品运行良好,但导入Spring库使它有点太大,我们决定有两个不同的类,一个用于使用Spring的项目,另一个用于那些不是。

理想情况下,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是静态的而不是可以覆盖的。有没有优雅的方法来做到这一点?我想保持一切都是静态的,因为这个转换器已被许多项目使用过,修复它会花费很多时间。

1 个答案:

答案 0 :(得分:3)

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

静态导致类之间的紧密耦合,并且正如你自己想象的那样:它会杀死"多态性。从这个意义上讲:它与良好实践相反。并非总是如此,但只要它妨碍您创建良好设计的能力,静态显然是错误的方法。

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