为什么我们需要这种特殊类型的构造函数?

开发者
public MyConstructor(MyConstructor mc){
   this.setId(mc.getId());
   this.setName(mc.getName());
}

在这里,为什么我们需要通过获取其getter方法来在构造函数中设置值。这背后有什么特殊目的吗?

马可13

正如其他答案中已指出的那样,这种构造函数主要用于克隆对象,有时也称为复制构造函数

正如Joshua Bloch在他的《有效的Java》一第11条中所建议的那样,这种构造clone()方法通常比实现该方法更可取,因为该clone()方法存在一些问题(有关详细信息,请参见本书或相应的stackoverflow问题)。

没有引人注目的理由来实现它完全一样的-因此,人们并不真正需要正是这种形式正如评论中提到的,人们可以(最有可能)将其写为

public MyConstructor(MyConstructor mc){
    this.id = mc.getId();
    this.name = mc.getName();
}

或者

public MyConstructor(MyConstructor mc){
    this.setId(mc.id);
    this.setName(mc.name);
}

或者

public MyConstructor(MyConstructor mc){
    this.id = mc.id;
    this.name = mc.name;
}

作者在这里选择使用嵌套set(mc.get())方法。它具有潜在的优势,即它仅依赖于get/set方法定义的接口,因此可能对更改更健壮。

有人可能会争论这是否是一种好的做法,但我认为对于复制构造函数而言,它很好且清楚地指出:“此对象仅在给定对象的基础上(且完全类似于)被初始化”。


旁注:克隆对象并为克隆赋予相同的ID很有可能会破坏ID的目的-但在某些情况下,这样做是适当的

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我们需要在MSIL中显式调用父构造函数?

来自分类Dev

为什么我们需要在JavaScript中定义构造函数

来自分类Dev

为什么我们需要一个用户提供的const对象构造函数?

来自分类Dev

为什么我们需要在实体中声明非空构造函数?

来自分类Dev

为什么我们在Typescript中需要任何类型?

来自分类Dev

为什么我们需要visibleCells函数(UICollectionView)

来自分类Dev

为什么我们需要一个默认的构造函数来在C ++中通过引用传递对象?

来自分类Dev

为什么我们需要一个默认的构造函数来在C ++中通过引用传递对象?

来自分类Dev

我们为什么需要容器?

来自分类Dev

为什么我们需要IO?

来自分类Dev

在这种情况下,我们需要禁用默认的复制构造函数并分配运算符?

来自分类Dev

为什么我们能够在 react 组件的构造函数中绑定函数?

来自分类Dev

我们需要什么ArrayList构造函数中的super()?

来自分类Dev

我不知道为什么当构造函数执行相同的工作时我们需要此程序的二传手

来自分类Dev

为什么我们不能使用表达式强健的构造函数?

来自分类Dev

为什么我们只有一个带有@Inject批注的构造函数?

来自分类Dev

为什么我们不能在构造函数中创建非静态自引用对象

来自分类Dev

为什么我们不能使用GetConstructor找到Int32的默认构造函数?

来自分类Dev

为什么我们不能在Java构造函数中传递字符串

来自分类Dev

为什么我们在Java枚举中使用未修改的构造函数

来自分类Dev

为什么我们可以在C ++中的构造函数中使用声明的变量

来自分类Dev

为什么我们在Java枚举中使用未修改的构造函数

来自分类Dev

为什么我们在构造函数中初始化对象

来自分类Dev

为什么我们不能在构造函数中创建非静态自引用对象

来自分类Dev

为什么我们可以访问由构造函数创建的实例的属性?

来自分类Dev

为什么我们需要创建一个one-arg构造函数才能使用临时的无名对象?

来自分类Dev

为什么我们需要将Apply和Applicative类型类分开?

来自分类Dev

为什么我们需要创建新的Icollection类型属性实例

来自分类Dev

为什么我们需要Scala的CanBuildFrom中的From类型参数

Related 相关文章

  1. 1

    为什么我们需要在MSIL中显式调用父构造函数?

  2. 2

    为什么我们需要在JavaScript中定义构造函数

  3. 3

    为什么我们需要一个用户提供的const对象构造函数?

  4. 4

    为什么我们需要在实体中声明非空构造函数?

  5. 5

    为什么我们在Typescript中需要任何类型?

  6. 6

    为什么我们需要visibleCells函数(UICollectionView)

  7. 7

    为什么我们需要一个默认的构造函数来在C ++中通过引用传递对象?

  8. 8

    为什么我们需要一个默认的构造函数来在C ++中通过引用传递对象?

  9. 9

    我们为什么需要容器?

  10. 10

    为什么我们需要IO?

  11. 11

    在这种情况下,我们需要禁用默认的复制构造函数并分配运算符?

  12. 12

    为什么我们能够在 react 组件的构造函数中绑定函数?

  13. 13

    我们需要什么ArrayList构造函数中的super()?

  14. 14

    我不知道为什么当构造函数执行相同的工作时我们需要此程序的二传手

  15. 15

    为什么我们不能使用表达式强健的构造函数?

  16. 16

    为什么我们只有一个带有@Inject批注的构造函数?

  17. 17

    为什么我们不能在构造函数中创建非静态自引用对象

  18. 18

    为什么我们不能使用GetConstructor找到Int32的默认构造函数?

  19. 19

    为什么我们不能在Java构造函数中传递字符串

  20. 20

    为什么我们在Java枚举中使用未修改的构造函数

  21. 21

    为什么我们可以在C ++中的构造函数中使用声明的变量

  22. 22

    为什么我们在Java枚举中使用未修改的构造函数

  23. 23

    为什么我们在构造函数中初始化对象

  24. 24

    为什么我们不能在构造函数中创建非静态自引用对象

  25. 25

    为什么我们可以访问由构造函数创建的实例的属性?

  26. 26

    为什么我们需要创建一个one-arg构造函数才能使用临时的无名对象?

  27. 27

    为什么我们需要将Apply和Applicative类型类分开?

  28. 28

    为什么我们需要创建新的Icollection类型属性实例

  29. 29

    为什么我们需要Scala的CanBuildFrom中的From类型参数

热门标签

归档