返回数据'可能暴露内部阵列?

时间:2015-04-06 13:23:55

标签: java arrays sonarqube clone

考虑一下

public class Data {

    private final SomeField[] fields;
    .....

    public SomeField[] getFields() {
        return map == null ? null : map.clone();
    }
  

安全性 - 方法返回内部数组

     

直接公开内部数组允许用户修改一些代码   这可能很关键。返回数组副本更安全。

我知道我们不应该使用clone()复制对象,而是使用copy constructor复制对象。

但是仍然会复制作为引用的内部对象。 建议哪些方法可以避免上述clone()

由于

2 个答案:

答案 0 :(得分:2)

实用程序方法Arrays.copyOf(T [] original,int newLength)将使用内部数组中的相同对象创建一个新数组。

返回内部数组的问题通常是防止对数组内容的意外更改,这些内容将与任何其他客户端共享。共享包含的对象通常没有相同的关注顺序,但如果您要实现某种类型的地图,您的要求可能会更加严格。

答案 1 :(得分:-2)

要解决此问题,您必须避免使用三元运算符。 而不是这个,你必须使用if运算符。

示例:

public CustomMap [] getMap(){     CustomMap [] obj = null;

if (map != null){
   obj = map.clone();
}
return obj;

}

OR

public CustomMap[] getMap() {
    CustomMap[] obj = map == null ? null : map.close();
    return obj;
}

我使用abouve代码解决了我的问题。 我认为必须明确创建一个新对象。我想。

问候!