gpt4 book ai didi

java - 复制构造函数访问其类的字段?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:52:31 26 4
gpt4 key购买 nike

我在阅读 java 中的可变/不可变类和复制构造函数时偶然发现了 this example .

在复制构造函数中,他使用如下的 getter:

 /**
* Copy constructor.
*/
public Galaxy(Galaxy aGalaxy) {
this(aGalaxy.getMass(), aGalaxy.getName());
//no defensive copies are created here, since
//there are no mutable object fields (String is immutable)
}

我的问题是,对于某些人来说,在复制构造函数中使用 getter 而不是仅仅访问以下字段,除了它是一种良好的编码习惯之外,还有其他原因吗:(aGalaxy.aMass, aGalaxy.aName)。您也可以找到这样做的示例,但我的意思是它纯粹是一种编码风格,还是在复制构造函数中使用 getter 有潜在好处?

最佳答案

虽然在大多数情况下是无害的,但当子类选择覆盖您调用的 getter 时,这种做法可能会导致一些难以捕获的错误。

这是一个简单的例子:

class Base {
private final String name;
public String getName() {return name;}
public Base(String name) {
this.name = name;
}
public Base(Base b) {
this(b.getName());
}
}
class Derived extends Base {
public String getName() {
return "["+super.getName()+"]";
}
public Derived(String name) {
super(name);
}
public Derived(Derived d) {
this(d.getName());
}
}

请注意 Derived 如何覆盖 getName(),因此 Derived 的复制构造函数正在访问名称的修改版本,从而导致一个问题:

Derived orig = new Derived("hello");
Derived copy = new Derived(orig);
System.out.println(orig.getName()); // Prints [hello]
System.out.println(copy.getName()); // Prints [[hello]]

最后一张打印品的方括号加倍,因此副本不是真正的副本。

使用 protected 变量或使您的 getters final 可以帮助您避免这个问题。

我认为这个问题的根本原因是让子类覆盖存储属性的 getter,所以我更喜欢让你的 getter final 的方法。

Demo.

关于java - 复制构造函数访问其类的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39651676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com