这是java中的一个安全漏洞:
// Potential security hole!
static public final Thing[] VALUES = { ... };
一般的解决方案可以是
private static final String[] VALUES = { "a", "b" };
public static final String[] values()
{
return VALUES.clone();
}
我认为克隆数组仍然可以修改内部值,为什么这被认为是可接受的解决方案?
答案 0 :(得分:1)
它允许修改原始数组的副本的内容。但是原始数组未修改。
并且由于values()
的每个呼叫者都收到一个单独的副本,因此一个呼叫者修改其副本不会影响另一个呼叫者。
也就是说,一般而言,您应该更喜欢集合而不是数组。并且可以使集合不可修改,从而避免进行复制。
public static final List<Thing> VALUES = Collections.unmodifiableList(Arrays.asList(...));
但是请注意,无论选择哪种解决方案,如果Thing
并非一成不变,那么任何人仍然可以修改事物的状态,而无需修改任何数组或列表。