问询大型知名项目中可变对象的Java `with`相关方法命名规范
with命名实践(大型项目实际案例) 哈哈,这个问题确实有点小众,毕竟大家聊with前缀时,默认都是和不可变对象绑定的——返回新实例、不修改原对象。不过我在不少知名开源项目里,见过针对可变对象的类似流畅API命名,整理出来给你参考:
setXxx链式返回自身:这是最常见的模式,比如Spring的RestTemplateBuilder、Apache Commons的配置类里,很多setter方法会设计成返回this,实现链式调用。比如:restTemplateBuilder.setConnectTimeout(Duration.ofSeconds(5)) .setReadTimeout(Duration.ofSeconds(10)) .build();虽然用的是
set前缀,但本质和with的流畅性目标一致,而且语义明确:就是修改当前可变对象的状态。复用
withXxx但明确标注语义:少数项目会直接用with前缀,但会在Javadoc里特意说明这是修改当前对象并返回自身,而非创建新实例。比如一些老的Java EE实体类、部分ORM框架的可变模型类里会这么做——虽然打破了with用于不可变的常规约定,但为了API风格统一还是保留了前缀,只是靠文档明确区分。configureXxx/applyXxx前缀:Google Guava的一些可变集合工具类里,会用这类前缀来强调“对当前对象应用修改”的语义,比如:Lists.newArrayList() .configureCapacity(200) .applyFilter(item -> item != null);这种命名刻意和不可变对象的
with划清界限,避免混淆。动词短语直接链式调用:像
addXxx、removeXxx这类本身就属于修改可变对象的方法,很多项目也会让它们返回this。比如大家熟悉的StringBuilder:new StringBuilder() .append("Hello") .append(" ") .append("World");这也是可变对象流畅API的一种实践,虽然不是
with相关,但属于同场景下的常用命名方式。
总的来说,大部分大型项目还是会尽量区分可变和不可变的API命名,with前缀通常还是严格留给不可变对象返回新实例的场景,可变对象更多用上面这些模式来实现流畅调用。
内容的提问来源于stack exchange,提问作者Alvin Thompson

