[英]Java - Clone the property inside getter method
各位,
我正在浏览此处提到的 Java 最佳编码实践
http://viralpatel.net/blogs/most-useful-java-best-practice-quotes-java-developers/
第二个引用说,
引用 2:永远不要公开类的实例字段
我同意这是绝对正确的,但我被困在这句话下面几行的作者建议中。
他说,
private String[] weekdays =
{"Sun", "Mon", "Tue", "Thu", "Fri", "Sat", "Sun"};
public String[] getWeekdays() {
return weekdays;
}
但是编写 getter 方法并不能完全解决我们的问题。 该阵列仍可访问。 使其不可修改的最佳方法是返回数组的克隆而不是数组本身。 因此 getter 方法将更改为
public String[] getWeekdays() {
return weekdays.clone();
}
我自己从未在 Java 类的任何 getter 方法中使用过clone()
。
我想知道(因为它被提到是一种良好的做法) - 为什么should use
在 getter 方法中should use
/ shouldn't use
clone()
? 在哪些情况下?
它是否有资格成为 Java 的良好编码实践?
谢谢
这在Joshua Bloch 的“Effective Java”一书中讨论过。 有一个部分称为“需要时制作防御性副本” (第 2 版第 39 节)。
https://www.informit.com/articles/article.aspx?p=31551&seqNum=2
一本很好的书,可以讨论这样的话题。
private String[] weekdays =
{"Sun", "Mon", "Tue", "Thu", "Fri", "Sat", "Sun"};
public String[] getWeekdays()
{
return weekdays;
}
如果不使用clone
方法,这个类的用户可以做很多不道德的事情:
但是,返回一个克隆不会影响类和它的数据。 因此,类的其他用户不会受到影响。
如果你想保证整个对象图(包含数组)是不可变的,你可以在get()
clone() or System.arraycopy()
上clone() or System.arraycopy()
。 这通常在公开数组的 API 是公共的并且数组中的值存在约束或对象被多个线程访问时完成。 在这种情况下,不变性很重要。
假设您有一个具有getItemsSortedByPrice()
方法的GroceryStore
对象。 您将项目保留在按价格维护订单的数组中,但如果您返回此数组,客户端代码可能会修改它并破坏对象的(内部)不变量。
如果这是内部代码(即)不是公共 API 的一部分,并且您知道您不会修改数组,那么克隆/应对可能没有必要,因为它会损害性能而没有真正的好处。
一切都取决于上下文。
数组只是对象,适用于普通对象的所有 (im) 可变性规则/实践也适用于数组。
我认为您的用例与建议的 Java 代码不匹配。 该示例适用于与您不同的用例。
最后一个数组对我来说听起来像Enums ,我认为这更符合您的要求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.