我有一个静态字段,它由静态块中的config属性初始化。我的代码将运行Fingbugs警告,遇到如下所述的警告。
Field是一个可变的集合 可变集合实例被分配给最终的静态字段,因此可以通过恶意代码或偶然从另一个包更改。考虑将此字段包装到Collections.unmodifiableSet / List / Map / etc中。避免这种漏洞。
Class A{
private static String uri;
static{
uri= Properties.getpropery("SOME_PROPERTY"); /// Here i am getting the Findbugs warning
}
}
如何制作未修改的Set并在以后的阶段将其作为字符串文字传递?
答案 0 :(得分:0)
我认为这是Findbugs中的一个错误。现在尝试将该字段标记为 private ,这可能有助于解决此问题。如果这无法帮助修复它,我对它的直觉感觉就会变得更大了。
正如您所知,异常有点偏离,因为它不是Collection,并且不能在此类之外进行更改,因为它具有private
访问修饰符,并且它是一个不可变的String Java中的自然。
让我们来看看这个例子;
public class Class1 {
private static String STRING_VALUE = "I'm secure!";
private static List<String> COLLECTION = Arrays.asList("I'm Secure!");
public static void main(String[] args) {
Class2.changeStatic(STRING_VALUE);
System.out.println(STRING_VALUE); // I'm secure!
Class2.changeStatic(COLLECTION);
System.out.println(COLLECTION.get(0)); // I'm unsecure!
}
}
public class Class2 {
public static void changeStatic(String secureString) {
secureString = "I'm unsecure!";
}
public static void changeStatic(List<String> unsecureList) {
unsecureList.set(0, "I'm unsecure!");
}
}
正如您所看到的,无法在类本身之外更改Class1的字符串值。在集合的情况下,这是可能的,因为元素保存在可变容器中。
因为在类/包之外可以更改Collection中的元素,所以他们建议将它包装在一个不可修改的Collection中,该Collection不会将修改委托给包装列表,而是抛出异常:
public class Class1 {
private static List<String> COLLECTION = Collections.unmodifiableList(Arrays.asList("I'm Secure!"));
public static void main(String[] args) {
Class2.changeStatic(COLLECTION);
}
}
public class Class2 {
public static void changeStatic(List<String> unsecureList) {
unsecureList.set(0, "I'm unsecure!"); // throws a java.lang.UnsupportedOperationException
}
}