【问题标题】:Returning 'data' may exposed internal array?返回“数据”可能会暴露内部数组?
【发布时间】:2015-06-10 21:43:02
【问题描述】:

考虑一下

public class Data {

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

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

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

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

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

但这仍然会复制作为引用的内部对象。 避免上述clone() 的推荐方法是什么?

谢谢

【问题讨论】:

  • 正如我在Effective java 中所读到的,我们应该使用Copy Constructorcopy static factory method 而不是clone()。我们应该需要创建所有对象并从旧对象分配值。

标签: java arrays sonarqube clone


【解决方案1】:

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

例子:

公共 CustomMap[] getMap() { CustomMap[] obj = null;

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

}

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

我使用上面的代码解决了我的问题。 我认为这是显式创建新对象所必需的。我想。

问候!

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多