使用自定义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
是静态的而不是可以覆盖的。有没有优雅的方法来做到这一点?我想保持一切都是静态的,因为这个转换器已被许多项目使用过,修复它会花费很多时间。
答案 0 :(得分:3)
说真的:不要在这里使用 static 。
静态导致类之间的紧密耦合,并且正如你自己想象的那样:它会杀死"多态性。从这个意义上讲:它与良好实践相反。并非总是如此,但只要它妨碍您创建良好设计的能力,静态显然是错误的方法。
因此:只需从当前代码中删除 static 关键字即可。是的,这将花费你现在。但它使您能够在将来执行正确的事情。