静态场启动到不可修改的集合

时间:2017-03-02 12:27:15

标签: java findbugs

我有一个静态字段,它由静态块中的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并在以后的阶段将其作为字符串文字传递?

1 个答案:

答案 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
        }
    }