用byte []取消Android Unread Field警告

时间:2015-12-30 11:03:53

标签: java android arrays findbugs

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

2 个答案:

答案 0 :(得分:1)

就像@Thomas建议的那样,Arrays总是可变的。 修复程序返回了属性的副本而不是属性本身:

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总是会返回该对象的副本。对于阵列来说情况并非如此。

答案 1 :(得分:0)

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

  1. URF_UNREAD_FIELD - 如果存在getter,则字段计为读取,因为然后FindBugs假定从类外部读取字段。如果没有发生这种情况,你会产生某种误报,需要进一步分析或抑制。
  2. EI_EXPOSE_REP2 - 数组总是可变的,因此通过从getter返回数组,您可以将其公开给修改。您可以通过Arrays.copyOf()返回数组的副本,或者再次禁止警告。
  3. 通过@SuppressFBWarnings注释(doc)抑制FindBugs警告。您需要来自FindBugs注释的类路径上的FindBugs lib文件夹中的annotations.jar和jsr305.jar才能使FindBugs注释生效。例如:

    @SuppressFBWarnings("URF_UNREAD_FIELD")