Java 返回';数据';可以公开内部阵列吗?
想想这个Java 返回';数据';可以公开内部阵列吗?,java,arrays,sonarqube,clone,Java,Arrays,Sonarqube,Clone,想想这个 public class Data { private final SomeField[] fields; ..... public SomeField[] getFields() { return map == null ? null : map.clone(); } 安全-方法返回内部数组 直接公开内部数组允许用户修改某些代码 这可能是至关重要的。返回数组的副本更安全 我明白我们不应该使用clone()来复制对象,而应该使用co
public class Data {
private final SomeField[] fields;
.....
public SomeField[] getFields() {
return map == null ? null : map.clone();
}
安全-方法返回内部数组
直接公开内部数组允许用户修改某些代码
这可能是至关重要的。返回数组的副本更安全
我明白我们不应该使用clone()
来复制对象,而应该使用copy constructor
来复制对象
但它仍然复制作为引用的内部对象。
建议使用哪些方法来避免上面的clone()
多谢实用程序方法array.copyOf(T[]original,int newLength)将使用内部数组中的相同对象创建一个新数组
返回内部数组的问题通常是防止对数组内容进行意外更改,这些更改将与任何其他客户端共享。共享包含的对象通常不是同一个关注顺序,但如果您正在实现某种映射,您的要求可能会更严格。要解决此问题,您必须避免使用三元运算符。 相反,必须使用if运算符 例如: 公共CustomMap[]getMap(){ CustomMap[]obj=null
if (map != null){
obj = map.clone();
}
return obj;
}
或
我用abouve代码解决我的问题。
我认为创建一个新的显式对象是必须的。我想
问候 正如我在
effectivejava
中读到的,我们应该使用copyconstructor
或copyctaticfactory方法,而不是clone()
。我们需要创建所有对象,并从旧对象中赋值。
public CustomMap[] getMap() {
CustomMap[] obj = map == null ? null : map.close();
return obj;
}