如何重构两个逻辑相同但输入参数类型不同的Java方法?
重构两个Java方法为通用方法的方案
你的两个方法核心逻辑都是执行put(key, value)操作,但由于Map<String,String>和GenericRecord没有共同的父接口定义put方法,直接用普通泛型会编译失败。下面是几种可行的重构方案:
方案1:自定义函数式接口+方法引用(推荐)
先定义一个极简的函数式接口,统一键值写入的行为:
@FunctionalInterface public interface KeyValueWriter { void put(String key, String value); }
然后编写通用的处理方法,接收这个接口实例:
public void putKeyValue(KeyValueWriter writer, String key, String value) { writer.put(key, value); }
调用时通过方法引用直接适配不同的容器类型:
// 处理Map<String,String>的场景 Map<String, String> hashMap = new HashMap<>(); putKeyValue(hashMap::put, "username", "john_doe"); // 处理GenericRecord的场景 GenericRecord record = new GenericRecordImpl(); // 假设你的GenericRecord实现类 putKeyValue(record::put, "email", "john@example.com");
这种方式编译期类型安全,性能无损耗,还能灵活扩展到其他有put(String,String)方法的类。
方案2:反射实现(不推荐)
如果不想额外定义接口,可以用反射调用put方法,但这种方式存在编译期无法校验、性能差、异常处理繁琐的问题:
public <T> void putGeneric(T container, String key, String value) { try { Method putMethod = container.getClass().getMethod("put", String.class, String.class); putMethod.invoke(container, key, value); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { throw new RuntimeException("Failed to execute put operation", e); } }
调用时直接传入任意带有put(String,String)方法的对象即可,但不建议在生产代码中使用。
方案3:修改GenericRecord实现Map接口(仅限自定义类)
如果GenericRecord是你团队自定义的类,可以让它实现Map<String, String>接口,这样就能直接复用原有的method1,不需要额外重构:
public class GenericRecordImpl implements Map<String, String>, GenericRecord { // 实现Map接口的所有方法,以及GenericRecord自身的方法 }
但如果GenericRecord的核心逻辑和Map差异较大,这种方案会增加不必要的代码复杂度。
内容的提问来源于stack exchange,提问作者hiren shah
相关产品推荐
相关产品推荐

