V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
greatHair
V2EX  ›  Java

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

  •  
  •   greatHair · 2020-12-17 17:49:47 +08:00 · 1563 次点击
    这是一个创建于 1197 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    例如:

    正常写法: 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

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

    如果 setid 这么定义就可以像你那么写,但是这样不符合规范
    public Brand setId(Long id){
    this.id = id;
    return this;
    }
    nekochyan
        7
    nekochyan  
       2020-12-17 18:03:03 +08:00
    你自己想想你 setId 返回的是什么
    wysnylc
        8
    wysnylc  
       2020-12-17 18:03:30 +08:00
    百度 链式
    hoyixi
        9
    hoyixi  
       2020-12-17 18:04:03 +08:00
    报错,报的啥错,你不看一眼吗
    greatHair
        10
    greatHair  
    OP
       2020-12-17 18:05:46 +08:00
    谢谢大家,我明白了,大师,我悟了。(我有点蠢
    anansi
        11
    anansi  
       2020-12-17 18:07:48 +08:00
    这个也太弱智了吧,什么堆啊栈啊的
    Vegetable
        12
    Vegetable  
       2020-12-17 18:08:05 +08:00
    有点好笑,因为 setId 返回的不是 Brand,如果是 js 之类的,还得(new Brand()).setId 明确你 new 的是谁才行。
    Vegetable
        13
    Vegetable  
       2020-12-17 18:08:56 +08:00
    @Vegetable 哦不用括号,弄混了
    dcalsky
        14
    dcalsky  
       2020-12-17 18:09:30 +08:00
    你朋友一听就是老八股文大师了。
    zhuweiyou
        15
    zhuweiyou  
       2020-12-17 18:09:32 +08:00   ❤️ 1
    写个带参构造函数不行么
    syozzz
        16
    syozzz  
       2020-12-17 18:33:05 +08:00
    。。。
    SkyLine7
        17
    SkyLine7  
       2020-12-23 15:08:38 +08:00
    3 楼正解
    KarmaWu
        18
    KarmaWu  
       2021-02-07 15:57:50 +08:00
    写个带参构造函数、或者 Lombok @Builder 不香么?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   962 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:53 · PVG 05:53 · LAX 14:53 · JFK 17:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.