Как исправить ошибку FindBug «Может раскрыть внутреннее представление, включив ссылку на изменяемый объект» при настройке массива объектов?

У меня есть метод, который принимает массив объектов в качестве входных данных и сохраняет его в переменной экземпляра. Вот код, который делает это, но FindBugs сообщает об ошибке, говоря: «Может раскрыть внутреннее представление, включив ссылку на изменяемый объект».

public final class HelloWorld
{
    public final Hello objs[];

    public HelloWorld(Hello[] inputs)
   {
        this.objs = inputs;
   }

}

Я пытался использовать Arrays.copyOf, но все равно получаю эту ошибку.

this.objs = Arrays.copyOf(inputs,inputs.length);

Как исправить эту проблему с FindBugs?


person yathirigan    schedule 16.11.2015    source источник
comment
как написано, после того, как кто-то создаст объект Helloworld, он может изменить содержимое входных данных (свою переменную), и это изменит версию Helloworld.   -  person MeBigFatGuy    schedule 02.12.2015


Ответы (1)


Вы должны изменить своего члена на private :

private final Hello objs[];

Хотя объявление члена как final предотвращает его назначение после первой инициализации, это не предотвращает назначение его отдельных записей, просто написав:

Hello[] harr = {new Hello(), new Hello()};
HelloWorld hw = new HelloWorld(harr);
hw.objs[1] = new Hello(); // this would mutate the contents of your array member
person Eran    schedule 16.11.2015
comment
но как изменение модификатора доступа исправит это? - person yathirigan; 16.11.2015
comment
@yathirigan Вы не сможете получить доступ к члену массива из-за пределов вашего класса. (т.е. 3-я строка в моем фрагменте кода не пройдет компиляцию) - person Eran; 16.11.2015
comment
получил это, но после того, как я сделал его приватным, должен ли я по-прежнему использовать Arrays.copyOf или просто сделать objs = inputs? у меня есть метод получения ( getObjs() ) для этой переменной экземпляра. должен ли я использовать objs.clone() для возврата значений в методе получения? - person yathirigan; 16.11.2015
comment
@yathirigan Вы все равно должны использовать Arrays.copyOf. В противном случае в моем примере вы сможете изменить массив элементов на harr[i]=.... Также может быть хорошей идеей вернуть копию массива в вашем геттере (при условии, что вызывающая сторона этого метода не сможет изменить ваш массив элементов). - person Eran; 16.11.2015