是否有在构造函数中复制对象的速记?

Is there a shorthand to copy an object within a constructor?

提问人:Eeshaan 提问时间:4/22/2021 最后编辑:Eeshaan 更新时间:4/22/2021 访问量:1949

问:

有没有办法在构造函数中实现? 是我想复制的对象(因此是与 相同类的对象,是对象引用)。this = thatthatthisthis

class Foo {

  private final Bar bar;

  public Foo() {
    Foo that = DaggerFactory.create().getFoo();
    // this = that; but it's not working!?
  }
  
  @Inject
  public Foo(Bar bar) {
    this.bar = bar;
  }

  // Other methods
}

我见过复制构造函数的例子,他们一个接一个地复制成员,即.这是我的最后一个选择,因为我在班上有几个成员,我不想不必要地“弄乱”我的代码。this.bar = that.bar

P.S. 我确实想通过空构造函数实例化对象,因为这就是 AWS Lambda 的工作方式(我将在那里部署它)。到目前为止,我还没有找到任何可以让 Lambda 使用 Dagger 提供的对象的方法。如果有更好的 Lambda / Dagger 方法,那也很棒!

Java aws-lambda dagger-2 复制构造函数

评论

0赞 Jesper 4/22/2021
无法使构造函数返回使用工厂方法(如示例中)创建的对象。当构造函数运行时,该对象已存在,您需要对其进行初始化。在 Java 中无法分配 to。DaggerFactory.create().getFoo()this
1赞 Michael 4/22/2021
不,没有速记。
0赞 juwil 4/22/2021
你可以看看龙目岛的Builder(toBuilder=true),它给你一个可以满足你需求的构建器。
0赞 Eeshaan 4/22/2021
@juwil酷!将调查
0赞 Eeshaan 4/22/2021
@Jesper 让我们暂时忘记工厂。如果它是一个常规的复制构造函数呢?一个接一个地复制成员是唯一的选择吗?

答:

1赞 Stephen C 4/22/2021 #1

没有聪明的(快捷方式/速记)方法来编写 Java 中的复制构造函数。在源代码级别,必须一次分配一个字段。

通常,我会“咬紧牙关”并编写代码。但还有其他几种选择:

  • 您的 IDE 可能有办法生成复制构造函数。(Eclipse 没有,但显然你可以为所有字段生成一个常规构造函数,然后在生成的代码上做一些巧妙的搜索替换操作;参见 Eclipse 生成复制构造函数)

  • 可以想象,您可以编写一些可重用的代码,使用反射将字段从一个对象复制到另一个对象。这是相当低效的,但如果你必须处理具有荒谬数量的字段的类,它可能是可以接受的。

  • 您可以改用该机制。clone()

评论

0赞 Eeshaan 4/22/2021
您碰巧知道类似于 Lombok 的复制构造函数吗?龙目岛似乎没有@NoArgsConstructor
0赞 Eeshaan 4/22/2021
然后我可以使用this(that)
0赞 Stephen C 4/22/2021
如果您要问的是 Java 或 Lombok?这个问题和我的答案是关于Java的。
0赞 Eeshaan 4/22/2021
是的,这些问题是关于Java的,不幸的是,根据评论和你的回答,没有捷径。所以我问你是否知道,根据你的XP,任何注释
0赞 Eeshaan 4/22/2021
因为IDE方式仍然会有“代码混乱”(至少是IMO),我不太确定的反射,也不是我问题的答案clone()