如何将变量转换为两类之一的实例以优化代码可读性?
可行的实现思路
1. 定义公共接口(推荐方案)
如果有权限修改Class1和Class2,最优雅的方式是让两个类实现同一个公共接口,把getAllMyObjects方法抽象到接口中。这样变量可以直接声明为接口类型,无需类型判断和强转。
// 定义公共接口 interface MyObjectsProvider { Collection<MyObjects> getAllMyObjects(); } // 修改Class1实现接口 public class Class1 implements MyObjectsProvider { @Override public Collection<MyObjects> getAllMyObjects() { // 原有实现逻辑 return ...; } } // 修改Class2实现接口 public class Class2 implements MyObjectsProvider { @Override public Collection<MyObjects> getAllMyObjects() { // 原有实现逻辑 return ...; } } // 使用时直接调用方法 MyObjectsProvider variable = anotherVar; list.addAll(variable.getAllMyObjects());
2. 使用Java 16+的switch模式匹配
如果无法修改Class1和Class2(比如是第三方类),可以利用Java 16引入的switch模式匹配,让代码更简洁直观,避免重复的类型判断和强转。
var list = new ArrayList<MyObjects>(); var variable = anotherVar; list.addAll( switch(variable) { case Class1 c1 -> c1.getAllMyObjects(); case Class2 c2 -> c2.getAllMyObjects(); default -> throw new IllegalArgumentException("Unexpected type: " + variable.getClass()); } );
3. 封装类型判断到工具方法
如果不想用switch模式匹配,也可以把类型判断和方法调用的逻辑封装到一个工具方法里,减少重复代码,提升可读性。
// 工具方法 private static Collection<MyObjects> extractMyObjects(Object source) { if (source instanceof Class1 c1) { return c1.getAllMyObjects(); } else if (source instanceof Class2 c2) { return c2.getAllMyObjects(); } throw new IllegalArgumentException("Unsupported type: " + source.getClass()); } // 使用工具方法 var list = new ArrayList<MyObjects>(); var variable = anotherVar; list.addAll(extractMyObjects(variable));
内容的提问来源于stack exchange,提问作者Kollegah der Boss
相关产品推荐
相关产品推荐

