如何重构转换方法实现多返回类型支持且无需向下转型
重构方案
你可以通过Java泛型方法实现需求,既能灵活支持不同返回类型,也不需要调用时强制转型,这里提供两种适配不同场景的实现:
方案1:通用泛型实现(不绑定Util逻辑)
如果不需要通过Util实例判断转换目标类型,直接把目标类作为入参传入即可,是适用范围最广的实现:
protected <T> T convert(String body, Class<T> targetClass) throws IOException { Reader reader = new StringReader(body); // 注意:ObjectMapper是线程安全的,建议抽为单例成员变量,不要每次方法内创建 ObjectMapper objectMapper = new ObjectMapper(); return objectMapper.readValue(reader, targetClass); }
调用方式:
MyClass myClass = converter.convert(body, MyClass.class); // 需要转其他类型直接传入对应Class即可 OtherClass otherClass = converter.convert(body, OtherClass.class);
方案2:绑定Util实例的实现(兼容原有逻辑)
如果你的业务逻辑确实需要通过Util实例的类型对应固定的转换目标类,可以先给Util扩展返回目标类型的接口,再结合泛型实现:
首先给Util父类/接口增加获取目标类的方法:
public interface Util { Class<?> getTargetClass(); } // MyUtil实现 public class MyUtil implements Util { @Override public Class<MyClass> getTargetClass() { return MyClass.class; } } // 后续新增其他Util只需实现该方法即可,不需要修改convert方法逻辑 public class OtherUtil implements Util { @Override public Class<OtherClass> getTargetClass() { return OtherClass.class; } }
改造convert方法:
@SuppressWarnings("unchecked") protected <T> T convert(String body, Util util) throws IOException { Reader reader = new StringReader(body); ObjectMapper objectMapper = new ObjectMapper(); Class<T> targetClass = (Class<T>) util.getTargetClass(); return objectMapper.readValue(reader, targetClass); }
调用方式:
MyClass myClass = converter.convert(body, new MyUtil()); OtherClass otherClass = converter.convert(body, new OtherUtil());
优化建议
- ObjectMapper实例化成本较高且线程安全,建议抽为类的单例成员变量复用,不要每次调用convert方法都新建
- 可以根据业务需要对方法内抛出的IOException、JsonParseException等做封装,统一转换为自定义业务异常再抛出
- 增加入参合法性校验,body为null/空串、targetClass为null的场景提前抛出明确的参数异常
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

