有没有 V 友能解惑呀,为什么不能新建对象的同时给它的属性赋值。

2020-12-17 17:49:47 +08:00
 greatHair

写代码的时候突发奇想的在新建对象的同时给它的属性赋值。

例如:

正常写法: Brand brand = new Brand();

brand.setId(1);

我的错误写法: Brand brand = new Brand().setId(1);//这样写会报错。

new Brand().setId(1);//这样不会报错,但是没有办法调用对象去 getId()

朋友的解释是:

new 出来的对象( B )都存放于堆中,而实例化的对象( A )在栈里。 正常写法调用方法( C )的顺序 是 A->B->C

错误的写法里,直接 B->C,然后并不能再反过来,将 B 指向 A 。 (B->C)->A

1594 次点击
所在节点    Java
18 条回复
codehz
2020-12-17 17:53:45 +08:00
(问题不是在 setId 没返回 this 上吗(
gotonull
2020-12-17 17:56:33 +08:00
Lombok 不就能解决这问题吗
l48x4264l46
2020-12-17 17:57:52 +08:00
new Brand() 返回的是当前实例,所以可以调用 setId 方法。而 setId 放回是 void,与 Brand brand 不符。所以不能用。试试使用建造者模式去创建对象。就可以实现你所想要的结果了。
chendy
2020-12-17 17:59:04 +08:00
因为你的 setId 返回的不是 Brand…(猜测是 void
ingxx
2020-12-17 18:00:37 +08:00
set 方法返回 this 就行了,@accessors 或者 @Builder
ily433664
2020-12-17 18:01:29 +08:00
你那么写相当于把 setid 方法的返回值赋值给 brand 对象,但是 setid 方法没有返回值,所以就报错了

如果 setid 这么定义就可以像你那么写,但是这样不符合规范
public Brand setId(Long id){
this.id = id;
return this;
}
nekochyan
2020-12-17 18:03:03 +08:00
你自己想想你 setId 返回的是什么
wysnylc
2020-12-17 18:03:30 +08:00
百度 链式
hoyixi
2020-12-17 18:04:03 +08:00
报错,报的啥错,你不看一眼吗
greatHair
2020-12-17 18:05:46 +08:00
谢谢大家,我明白了,大师,我悟了。(我有点蠢
anansi
2020-12-17 18:07:48 +08:00
这个也太弱智了吧,什么堆啊栈啊的
Vegetable
2020-12-17 18:08:05 +08:00
有点好笑,因为 setId 返回的不是 Brand,如果是 js 之类的,还得(new Brand()).setId 明确你 new 的是谁才行。
Vegetable
2020-12-17 18:08:56 +08:00
@Vegetable 哦不用括号,弄混了
dcalsky
2020-12-17 18:09:30 +08:00
你朋友一听就是老八股文大师了。
zhuweiyou
2020-12-17 18:09:32 +08:00
写个带参构造函数不行么
syozzz
2020-12-17 18:33:05 +08:00
。。。
SkyLine7
2020-12-23 15:08:38 +08:00
3 楼正解
KarmaWu
2021-02-07 15:57:50 +08:00
写个带参构造函数、或者 Lombok @Builder 不香么?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/736479

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX