2015-12-30 28 views
6

Używam pakietu java.lang.SuppressWarnings w Android Studio.Wstrzymaj Ostrzeżenie nieprzeczytanego pola z bajtem []

nie mogę pozbyć się tego:

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

To się dzieje z metody setter.

Wszelkie pomysły na pozbycie się tego ostrzeżenia? Dzięki!

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

Ostrzeżenie:

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

Uwaga to dzieje się na boisku tylko, którego typ jest byte[]. Inne pola w tej samej klasie, które mają gettery, nie rzucają tego ostrzeżenia.

+0

Czy próbujesz ukryć ostrzeżenie lub rozwiązać problem w kodzie? Jeśli to drugie, musielibyśmy zobaczyć twój kod. –

+0

Chcę znaleźć sposób, aby zatrzymać ostrzeżenie za pomocą @Supress ... lub znaleźć inny sposób poprawy kodu, jeśli jest jakiś? – estoke

+0

Dzięki @Thomas, faktycznie ma getter: 'public byte [] getmPicture() {return mPicture.clone(); } 'dzięki za wskazanie mi konwencji fasoli dla setera. ('public void setP (T)') Dam to spróbować z Arrays.copyOf(). I ostatnia rzecz, którą sugerujesz, aby "powstrzymać ostrzeżenie", do czego dokładnie potrzebuję pomocy. Jakie będzie słowo kluczowe dla tego ostrzeżenia? @SupressWarning ("...?). Dzięki! – estoke

Odpowiedz

0

Tak jak sugerował @Thomas, tablice są zawsze zmienne. Rozwiązaniem wracał kopię własności nieruchomości zamiast samego:

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

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

zamiast

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

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

Co mi się nie wiedzieć, że dla innego typu String jak na przykład prosty getter zawsze zwróci kopię obiektu. Tak nie jest w przypadku Tablic.

0

Po wyjaśnieniu niektórych rzeczy w komentarzach, myślę, że odpowiedź jest taka.

  1. URF_UNREAD_FIELD - Pole liczy się jako przeczytane, jeśli istnieje program pobierający, ponieważ wtedy FindBugs zakłada, że ​​pole jest czytane spoza klasy. Jeśli tak się nie stanie, masz pewien rodzaj fałszywego pozytywu, który wymagałby dalszej analizy lub tłumienia.
  2. EI_EXPOSE_REP2 - Tablice są zawsze zmienne, więc zwracając tablicę z gettera, wystawiasz ją na modyfikację. Możesz zwrócić kopię tablicy przez Arrays.copyOf() lub ponownie wyłączyć ostrzeżenie.

ostrzeżenia FindBugs są tłumione przez @SuppressFBWarnings adnotacją (doc). Potrzebujesz adnotations.jar i jsr305.jar z folderu FindBugs lib na ścieżce klasy procesu analizy dla adnotacji FindBugs. Przykład:

@SuppressFBWarnings("URF_UNREAD_FIELD") 
+0

dzięki, ale musiałbym dodać bibliotekę zewnętrzną, aby móc korzystać z tego rozwiązania. I - nie pytaj dlaczego;) - to nie jest opcja. – estoke

+0

Cóż, zapytałeś, jak tłumić ostrzeżenia FindBugs, i tak właśnie jest. Jeśli nie możesz zmienić ścieżki klasy, a te JAR-y nie znajdują się na niej, nie możesz pominąć ostrzeżeń FindBugs. –

+0

Jasne ... Ale mogę również wyłączyć ostrzeżenie, poprawiając źródło błędu. Kiedy opublikowałem ten błąd, nie wiedziałem, że muszę dodać kolejną bibliotekę, żeby pominąć ostrzeżenie ... Więc twoja odpowiedź zdecydowanie mi pomogła! – estoke