2015-12-30 1 views
6

Я использую пакет java.lang.SuppressWarnings в Android Studio.Supress Android Непрочитанное предупреждение о поле с байтом []

Я не могу избавиться от этого:

EI_EXPOSE_REP2: May expose internal representation by incorporating reference to mutable object (findbugs task) 

Это происходит с помощью метода сеттер.

Любые идеи о том, как избавиться от этого предупреждения? Спасибо!

public class PropertyDetailDocumentStorageModel implements Parcelable { 
@SerializedName("picture") 
private byte[] mPicture;  
public void setmPicture(byte[] mPicture) { this.mPicture = mPicture; } 

Предупреждение:

setmPicture(byte[]) may expose internal representation by storing an externally mutable object into PropertyDetailDocumentStorageModel.mPicture 

Примечание это происходит на единственном поле, тип которого byte[]. Другие поля в том же классе, у которых есть геттеры, не бросают это предупреждение.

+0

Вы пытаетесь подавить предупреждение или решить проблему в коде? Если это последний, нам нужно будет увидеть ваш код. –

+0

Я хочу либо найти способ остановить предупреждение с помощью @Supress ... или найти другой способ улучшить код, если он есть? – estoke

+0

Спасибо @Thomas, на самом деле у него есть getter: 'public byte [] getmPicture() {return mPicture.clone(); } 'спасибо за то, что указали мне условное соглашение для setter. ('public void setP (T)') Я попробую с Arrays.copyOf(). И последнее, что вы предлагаете «подавить предупреждение», и именно это мне нужна помощь. Каким будет ключевое слово для этого предупреждения? @SupressWarning («...?). Спасибо! – estoke

ответ

0

Так, как и @Thomas, массивы всегда изменяемы. Исправление возвращал копию имущества вместо самого объекта недвижимости:

public byte[] getmPicture() { return Arrays.copyOf(mPicture, mPicture.length); } 

public void setmPicture(final byte[] picture) { this.mPicture = Arrays.copyOf(picture, picture.length); } 

вместо

public byte[] getmPicture() { return mPicture; } 

public void setmPicture(byte[] picture) { this.mPicture = picture; } 

То, что я не знаю, что для другого типа, например String, например, простой getter всегда возвращает копию объекта. Это не относится к массивам.

0

После прояснения некоторых вещей в комментариях, я думаю, что ответ таков.

  1. URF_UNREAD_FIELD - Поле считается считанным, если геттер существует, потому что тогда FindBugs предполагает, что поле считывается извне класса. Если этого не произойдет, у вас будет какой-то ложный позитв, который потребует дальнейшего анализа или подавления.
  2. EI_EXPOSE_REP2 - Массивы всегда изменяемы, поэтому, возвращая массив из геттера, вы подвергли его модификации. Вы можете вернуть копию массива через Arrays.copyOf() или, опять же, подавить предупреждение.

Предупреждения FindBugs подавляются посредством аннотации @SuppressFBWarnings (doc). Вам нужны annotations.jar и jsr305.jar из папки FindBugs lib на пути к классам процесса анализа для аннотаций FindBugs для работы. Пример:

@SuppressFBWarnings("URF_UNREAD_FIELD") 
+0

спасибо, но мне пришлось бы добавить внешнюю библиотеку, чтобы иметь возможность использовать это решение. И - не спрашивайте, почему;) - это не вариант. – estoke

+0

Ну, вы спросили, как подавить предупреждения FindBugs, и вот как это сделать. Если вы не можете изменить путь к классам, и эти JAR-файлы не включены в него, вы не можете подавлять предупреждения FindBugs. –

+0

Конечно ... Но я также могу подавить предупреждение, исправив источник ошибки. Когда я опубликовал эту ошибку, я не знал, что должен добавить другую библиотеку, чтобы подавить предупреждение ... Так что ваш ответ определенно помог мне! – estoke

Смежные вопросы