Java方法中设置两个不同类型可变参数的替代方案有哪些?
双可变参数场景的Java实现替代方案
方案1:使用集合/数组替换其中一类可变参数
Java语法仅允许可变参数放在参数列表最后一位,最直接的改法是将其中一类可变参数替换为List或数组类型,避开语法限制:
// 替换apis为集合,保留types的可变参数特性 void addInformation(final String call, final List<ApiEnum> apis, final ApiTypes... types); // 或两类参数都替换为集合,调用灵活性更高 void addInformation(final String call, final List<ApiEnum> apis, final List<ApiTypes> types);
调用时可以直接用List.of()(Java 9+)或Arrays.asList()(Java 8及以下)传入多个参数,兼容原来可变参数的传参便利性:
addInformation("testCall", List.of(ApiEnum.USER_ADD, ApiEnum.USER_QUERY), ApiTypes.READ, ApiTypes.WRITE);
方案2:构造者(Builder)模式封装入参
如果方法后续有参数扩展的可能,直接堆砌参数会导致签名臃肿,用Builder模式封装所有入参是更易维护的选择:
// 定义入参承载类,可结合Lombok的@Builder注解简化代码 @Data @Builder public class InfoParam { private String call; private List<ApiEnum> apis; private List<ApiTypes> types; } // 方法签名简化为单参数 void addInformation(InfoParam param);
调用时采用链式写法,可读性更高:
addInformation(InfoParam.builder() .call("testCall") .apis(List.of(ApiEnum.USER_ADD, ApiEnum.USER_QUERY)) .types(List.of(ApiTypes.READ, ApiTypes.WRITE)) .build());
方案3:参数组合类封装
如果ApiEnum和ApiTypes是强关联的配对关系,可直接定义组合类将二者绑定,方法仅保留单个可变参数:
// JDK 16+可用record简化定义,低版本用普通类即可 public record ApiPair(ApiEnum api, ApiTypes type) {} // 方法签名仅保留一个可变参数 void addInformation(final String call, final ApiPair... apiPairs);
调用示例:
addInformation("testCall", new ApiPair(ApiEnum.USER_ADD, ApiTypes.WRITE), new ApiPair(ApiEnum.USER_QUERY, ApiTypes.READ) );
方案4:方法重载适配
如果业务场景中参数组合较少,可通过重载方法满足不同的传参需求:
// 仅传apis的场景 void addInformation(final String call, final ApiEnum... apis); // 同时传两类参数的场景,用数组承接apis void addInformation(final String call, final ApiEnum[] apis, final ApiTypes... types);
该方案仅适合参数组合固定、不会频繁扩展的场景,否则会导致重载方法过多,维护成本升高。
内容的提问来源于stack exchange,提问作者mitali
相关产品推荐
相关产品推荐

