【问题标题】:Is there a shorthand to copy an object within a constructor?是否有在构造函数中复制对象的简写?
【发布时间】:2021-07-16 15:21:48
【问题描述】:

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

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。这是我最后的选择,因为我的班级里只有少数成员,我不想不必要地“弄乱”我的代码。

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

【问题讨论】:

  • 没有办法让构造函数返回一个使用工厂方法创建的对象(例如您的示例中的DaggerFactory.create().getFoo())。构造函数运行时,对象已经存在,需要初始化。在 Java 中无法分配给 this
  • 不,没有速记。
  • 您可能会看看 lombok 的 Builder(toBuilder=true),它为您提供了一个可以满足您需要的构建器。
  • @juwil 酷!会调查
  • @Jesper 让我们暂时忘记工厂。如果它是一个常规的复制构造函数呢?一个一个地复制成员是唯一的选择吗?

标签: java aws-lambda dagger-2 copy-constructor


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 你会碰巧知道类似于 Lombok 的 @NoArgsConstructor 的复制构造函数吗?龙目岛好像没有
  • 然后我可以使用this(that)
  • 如果您问的是 Java 还是 Lombok?这个问题和我的回答都是关于 Java 的。
  • 是的,这些问题是关于 Java 的,不幸的是,根据 cmets 和您的回答,没有捷径可走。所以我问你是否知道,根据你的 XP,任何注释
  • Coz IDE 方式仍然会有“代码混乱”(至少是 IMO),我不太确定的反射,clone() 并不是我问题的答案
猜你喜欢
  • 2013-10-14
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多