使用 byte[] 抑制 Android 未读字段警告

Suppress Android Unread Field warning with byte[]

我在 Android Studio 中使用 java.lang.SuppressWarnings 包。

我无法摆脱这个:

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

这是通过 setter 方法发生的。

如何摆脱这个警告?

 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[] 的字段上。 class 中具有 getter 的其他字段不会抛出此警告。

在评论中澄清了一些东西后,我认为答案是这样的。

  1. URF_UNREAD_FIELD - 如果 getter 存在,则该字段计为读取,因为 FindBugs 假定该字段是从 class 外部读取的。如果没有发生这种情况,则您有某种误报,需要进一步分析或抑制。
  2. EI_EXPOSE_REP2 - 数组始终是可变的,因此通过 returning 来自 getter 的数组,您可以修改它。您可以通过 Arrays.copyOf() return 数组的副本,或者再次取消警告。

FindBugs 警告通过 @SuppressFBWarnings 注释 (doc) 被抑制。您需要分析过程 class 路径上 FindBugs lib 文件夹中的 annotations.jar 和 jsr305.jar 才能使 FindBugs 注释起作用。示例:

@SuppressFBWarnings("URF_UNREAD_FIELD")

就像@Thomas 建议的那样,数组总是可变的。 修复是 return 复制 属性 而不是 属性 本身:

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 总是 return 对象的副本。数组不是这种情况。