gpt4 book ai didi

java - 返回私有(private)数据的副本而不是引用

转载 作者:搜寻专家 更新时间:2023-10-30 21:16:37 26 4
gpt4 key购买 nike

在令人惊叹的“Java the Good Parts”一书中,作者给出了一些代码,在其 getter 方法中返回一个对象的副本(与封装良好的字段一起使用),然后声明:

This approach, which tries to return copies of private data rather than references to that private data, is generally a good idea

为什么会这样?我认为封装的一个目标是确保没有人可以实际更改私有(private)成员。那我为什么要写这样的东西

private someType fieldName = new someType(); 

...

像这样定义它的 getter(假设有某种复制构造函数)

someType getSomething() 
{
return new someType(fieldName);
}

据我所知,我的意思是在你们进来之前:

到目前为止,这是有意义的,因为它服务于垃圾回收,因为这种方法不维护对实际对象的引用。

从内部类的角度来看也可以理解,从内部类的角度来看,任何方法都可以更改可通过引用访问的任何字段。

但我不怀疑这样做的两个原因真的超出了那个问题。

最佳答案

当类型可变时,通常返回一个副本很有用,这样客户端就无法从根本上修改您的数据,至少在不通知您的情况下是这样。考虑:

public class Person {
private Date dateOfBirth;

public Date getDateOfBirth() {
return dateOfBirth;
}

public void setDateOfBirth(Date dateOfBirth) {
// Do some validation, e.g. that it's after 1800
this.dateOfBirth = dateOfBirth;
}
}

这看起来不错,对吧?但是关于:

Person person = new Person();
person.setDateOfBirth(new Date()); // Now... fine.
// Aha! Modify the Date to a very long time ago. Now anyone else
// using the Person will be messed up...
person.getDateOfBirth().setTime(Long.MIN_VALUE);

如果 getDateOfBirth 返回一个副本,那么调用者对返回值引用的 Date 对象所做的任何更改都与其他任何人无关。 Person 对象仍然有效,因为它只有一个有效日期。当然,这应该被记录下来,这样无论谁写了上面的代码,都会期望它不会影响 Person 对象,因为会返回一个副本。

比所有这些复制更好的解决方案是支持不可变类型,但是 - 当您获得对不可变对象(immutable对象)的引用时,您可以尽可能广泛地共享它,知道没有人能改变它在你脚下的状态。

关于java - 返回私有(private)数据的副本而不是引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25704325/

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