You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

问询大型知名项目中可变对象的Java `with`相关方法命名规范

Java可变对象的类似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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:04:25