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

Java中修改对象参数的方法是否应返回该对象?哪种代码风格更优?

嘿,这两个问题问到点子上了,咱们一步步拆解清楚~

问题1:修改作为参数传入的对象后,是否需要返回该对象?

首先得明确Java的参数传递规则:Java是值传递,但对于对象来说,传递的是对象引用的副本。也就是说,你在方法里修改对象的内部属性(比如给player.name赋值),外部持有该对象引用的地方,看到的就是修改后的状态——因为引用指向的是同一个堆内存里的对象。

那返回对象的意义是什么?主要是为了支持链式调用(Fluent Interface),就像StringBuilder的append()方法那样,返回自身后可以连着写sb.append("a").append("b"),代码更简洁。但如果不需要这种链式写法,完全没必要返回——毕竟调用者已经拿着对象的引用了,返回反而容易让人误解“是不是创建了一个新对象?”。

问题2:哪种代码风格更受推崇?

咱们分两组代码来分析:

1. fillPlayerData的两种写法

先看两组代码:

void版本

void fillPlayerData(Player player, PlayerRequest playerRequest) {
    player.name = playerRequest.name;
    // ...其他填充逻辑
}

返回Player的版本

Player fillPlayerData(Player player, PlayerRequest playerRequest) {
    player.name = playerRequest.name;
    // ...其他填充逻辑
    return player;
}

哪种更推荐?看你的使用场景:

  • 如果只是单纯给已存在的Player对象填充数据,优先选void版本。它的语义很明确:“我执行一个填充数据的操作”,调用者本来就持有Player的引用,修改后直接用就行,返回对象反而显得多余。
  • 如果想支持链式调用(比如new Player().fillPlayerData(request).saveToDB()),那返回传入的Player就很合适——这种风格在构建器模式、流畅API里很常见,但一定要在方法注释里明确说明“返回传入的同一个Player对象”,避免调用者误以为是新创建的实例。

2. setErrors的两种写法

同样看两组代码:

void版本

void setErrors(Object object, List<Error> errors) {
    object.status = Status.ERROR;
    // ...其他错误设置逻辑
    object.addAll(errors);
}

返回Object的版本

Object setErrors(Object object, List<Error> errors) {
    object.status = Status.ERROR;
    // ...其他错误设置逻辑
    object.addAll(errors);
    return object;
}

这里的核心逻辑和上面类似,但还要注意类型安全的问题:如果返回的是Object,调用者拿到后还要强制转换,反而增加了出错的风险。除非把方法改成泛型版本:

<T> T setErrors(T object, List<Error> errors) {
    // ...逻辑不变
    return object;
}

这样返回的是原类型,链式调用才更有意义。否则的话,void版本更清晰——调用者的目的就是给对象设置错误状态,不需要额外的返回值。

总结一下
  • 普通场景下:如果只是修改对象内部状态,不需要链式调用,优先用void方法,语义更明确,避免歧义。
  • 流畅API/链式调用场景下:可以返回传入的对象,但要保证类型安全,并且注释清晰,让调用者知道返回的是同一个对象。

内容的提问来源于stack exchange,提问作者Alex Kokorin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:00:06