"Public static final"安全漏洞的解决方案



这是Java中的一个安全漏洞:

// Potential security hole!
static public final Thing[] VALUES = { ... };

一般解决方案可以是

private static final String[] VALUES = { "a", "b" };   
public static final String[] values()
{
return VALUES.clone();
}

我认为克隆数组仍然允许修改内部值,为什么这被认为是可接受的解决方案?

它允许修改原始数组副本的内容。但原始数组不会修改。

由于values()的每个调用方都会收到一个单独的副本,因此一个调用方修改其副本不会影响另一个调用方。

也就是说,您通常应该更喜欢集合而不是数组。并且集合可以变得不可修改,从而避免复制。

public static final List<Thing> VALUES = Collections.unmodifiableList(Arrays.asList(...));

但请注意,无论您选择哪种解决方案,如果Thing不是不可变的,任何人都可以修改事物的状态,而无需修改任何数组或列表。

最新更新