如何为多种内容类实现可复用的List翻译逻辑
问题:通用List翻译器的优雅实现方式
我有一个抽象基类,其中包含多个不同类型的translate重载方法,这些方法需要支持子类重写。我希望为任意这些类型的List实现通用翻译器,原本期望的代码实现如下:
protected <T> String translate(final List<T> list) { if (list == null) { return ""; } return conditionWrapper( list.stream() // 期望自动匹配对应类型的translate重载方法 .map(this::translate) .collect(Collectors.toList()) ); }
但Java无法解析此处的this::translate,因为它无法自动匹配所有可能的重载方法。
已尝试的方案及问题
方案一:instanceof分支判断
新增一个辅助方法,通过类型判断分发到对应的translate方法:
protected String translateHelper(final Object o) { if (o instanceof A) { return translate((A) o); } else if (o instanceof B) { return translate((B) o); } else if ... ... }
但当需要支持的类数量较多时,这种方式会导致代码冗余、可读性下降,还会带来性能损耗。
方案二:强制实现Translatable接口
定义一个翻译接口,要求所有需要翻译的类实现该接口:
protected interface Translatable { String translate(); }
但这种方式会强制修改目标类,有时候我根本无法修改这些第三方或已有类,或者修改后会给单元测试带来额外的复杂度。
当前的包装类实现
我需要保留translate方法的可重写特性,同时复用每个类型的翻译逻辑,目前采用包装类的方式实现:
protected <T extends Translatable> String translate(final List<T> list) { if (list == null) { return ""; } return conditionWrapper( list.stream() .map(Translatable::translate) .collect(Collectors.toList()) ); } protected final class ArgumentTranslator implements Translatable { final Argument argument; public ArgumentTranslator(final Argument value) { this.argument = value; } @Override public String translate() { return "something"; } } protected String translate(final Argument argument) { return new ArgumentTranslator(argument).translate(); }
调用List翻译方法时,需要先将元素转换为对应的包装类:
this.translate( values.argument() .stream() .map(ArgumentTranslator::new) .collect(Collectors.toList()) )
请问有没有比大量instanceof判断或样板式包装代码更优雅的实现方式?
内容的提问来源于stack exchange,提问作者Silverlight777
相关产品推荐
相关产品推荐

