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;
}