2015-12-30 19 views
6

Tôi đang sử dụng gói java.lang.SuppressWarnings trong Android Studio.Cảnh báo Android Unread Field cảnh báo bằng byte []

tôi không thể thoát khỏi cái này:

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

Nó đang xảy ra với một phương pháp setter.

Bất kỳ ý tưởng nào về cách loại bỏ cảnh báo này? Cảm ơn!

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

Cảnh báo:

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

Chú giải này đang xảy ra trên các lĩnh vực duy nhất có loại là byte[]. Các trường khác trong cùng một lớp có getters không ném cảnh báo này.

+0

Bạn đang cố gắng chặn cảnh báo hoặc giải quyết sự cố trong mã? Nếu đó là sau này, chúng tôi sẽ cần phải xem mã của bạn. –

+0

Tôi muốn tìm cách ngăn chặn cảnh báo bằng @Supress ... hoặc tìm cách khác để cải thiện mã nếu có bất kỳ mã nào? – estoke

+0

Cảm ơn @Thomas, thực sự nó đã có một getter: 'public byte [] getmPicture() {return mPicture.clone(); } 'cảm ơn đã chỉ cho tôi ra quy ước bean cho setter. ('public void setP (T)') Tôi sẽ thử với Arrays.copyOf(). Và điều cuối cùng bạn đề nghị "ngăn chặn cảnh báo", đó chính là điều tôi cần giúp đỡ. Điều gì sẽ là từ khóa cho cảnh báo đó? @SupressWarning ("...?). Cảm ơn! – estoke

Trả lời

0

Vì vậy, như @Thomas đề xuất, Mảng luôn có thể thay đổi. Việc sửa chữa được trả lại một bản sao của tài sản thay vì tài sản riêng của mình:

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

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

thay vì

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

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

Những gì tôi không biết là đối với các loại khác như String ví dụ, một đơn giản getter sẽ luôn trả về một bản sao của đối tượng. Đó không phải là trường hợp của mảng.

0

Sau khi làm rõ một số nội dung trong nhận xét, tôi nghĩ câu trả lời là như vậy.

  1. URF_UNREAD_FIELD - Trường được tính là đã đọc nếu có getter, vì sau đó FindBugs giả định rằng trường được đọc từ bên ngoài lớp. Nếu điều đó không xảy ra, bạn có một số loại dương tính giả cần phải phân tích hoặc ngăn chặn thêm.
  2. EI_EXPOSE_REP2 - Mảng luôn có thể thay đổi, do đó, bằng cách trả về mảng từ bộ thu thập, bạn sẽ hiển thị nó để sửa đổi. Bạn có thể trả lại một bản sao của mảng thông qua Arrays.copyOf(), hoặc, một lần nữa, ngăn chặn cảnh báo.

Cảnh báo FindBugs bị chặn thông qua chú thích @SuppressFBWarnings (doc). Bạn cần chú thích.jar và jsr305.jar từ thư mục lib FindBugs trên đường dẫn lớp của quá trình phân tích để chú thích FindBugs hoạt động. Ví dụ:

@SuppressFBWarnings("URF_UNREAD_FIELD") 
+0

cảm ơn nhưng, tôi sẽ phải thêm một thư viện bên ngoài để có thể sử dụng giải pháp này. Và - đừng hỏi tại sao;) - nó không phải là một lựa chọn. – estoke

+0

Vâng, bạn đã hỏi làm thế nào để ngăn chặn các cảnh báo FindBugs, và đây là cách thực hiện. Nếu bạn không thể thay đổi classpath và các JAR này không có trên nó, thì bạn không thể ngăn chặn các cảnh báo FindBugs. –

+0

Chắc chắn ... Nhưng tôi cũng có thể chặn cảnh báo bằng cách sửa lỗi nguồn. Khi tôi xuất bản lỗi này, tôi không biết tôi phải thêm một thư viện khác để ngăn chặn cảnh báo ... Vì vậy, câu trả lời của bạn chắc chắn đã giúp tôi! – estoke