使用 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 的其他字段不会抛出此警告。
在评论中澄清了一些东西后,我认为答案是这样的。
- URF_UNREAD_FIELD - 如果 getter 存在,则该字段计为读取,因为 FindBugs 假定该字段是从 class 外部读取的。如果没有发生这种情况,则您有某种误报,需要进一步分析或抑制。
- 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 对象的副本。数组不是这种情况。
我在 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 的其他字段不会抛出此警告。
在评论中澄清了一些东西后,我认为答案是这样的。
- URF_UNREAD_FIELD - 如果 getter 存在,则该字段计为读取,因为 FindBugs 假定该字段是从 class 外部读取的。如果没有发生这种情况,则您有某种误报,需要进一步分析或抑制。
- 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 对象的副本。数组不是这种情况。