【发布时间】:2012-09-24 06:00:59
【问题描述】:
伙计们,
我正在学习此处提到的 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()。
我想知道(因为它被提到是一种好的做法) - 为什么在 getter 方法中有一个 should use / shouldn't use clone() ?以及在哪些情况下?
它是否有资格成为 Java 的良好编码实践?
谢谢
【问题讨论】:
-
IMO - 对于不可变对象和原始数据类型,不需要克隆。对于其他一切,如果我们真的希望我们的数据安全,我们必须返回克隆副本而不是原始副本。
-
你可以返回
Arrays.asList(weekdays),它是不可变的。 -
@Jivings 不正确。 List 不接受新元素,但 set() 方法有效。
-
@SeanPatrickFloyd:是的,完全正确。你仍然可以使用
set,只是不要改变大小。我的错。
标签: java coding-style clone getter-setter