[英]Java PMD warning on non-transient class member
在线的:
private boolean someFlag;
我收到以下 PMD 警告:
找到非瞬态、非静态成员。 请标记为瞬态或提供访问器。
有人可以解释为什么会出现此警告及其含义吗? (我知道如何解决它,我不明白它为什么在那里......)
我也在许多其他成员声明中得到了这个......
编辑:我的 class绝对不是 bean,也不是可序列化的......
我假设您的 class 是根据定义实现Serializable
的bean。 瞬态变量将从序列化过程中排除。 如果您对 bean 进行序列化然后反序列化,则该值实际上将具有默认值。
PMD 假设您在这里处理的是可序列化的 bean。 对于一个 bean,它应该有所有成员变量的 getter/setter。 由于您省略了这些,因此您暗示您的成员变量不是 bean 的一部分......因此不需要序列化。 如果是这种情况,您应该将其从序列化中排除。 您可以通过将变量标记为“瞬态”来执行此操作。
现在我懂了。
添加此定义后:
private boolean someFlag;
...很清楚这里会发生什么:
此错误消息确实引用了访问模式。 PMD 声明 bean 引用的类也必须遵循 bean 模式。
最有可能支持属性样式访问的MyBean.referredClass.someFlag
将被转换为someObject.getReferredClass().getSomeFlag()
PMD 它期望有一个isSomeFlag/getSomeFlag
和setSomeFlag
方法,您可以通过它访问它的值,而不是直接访问它。
Found non-transient, non-static member. Please mark as transient **or provide accessors**.
查看这里发生的规则
BeanMembersShouldSerialize
如果 class 是 bean,或者被 bean 直接或间接引用,则它需要可序列化。 成员变量需要标记为瞬态,static,或者在 class 中有访问器方法。 将变量标记为瞬态是最安全和最简单的修改。 访问器方法应该遵循 Java 命名约定,即如果你有一个变量 foo,你应该提供 getFoo 和 setFoo 方法。
瞬态用作 jvm 序列化的提示,当将 class 写入流/磁盘时,它应该忽略它。 因此,如果您的实例已恢复并成为 memory 中的 object,则该字段将为 null。
static 成员的问题是,在 memory 中一次只有一个。 所以它并不完全清楚反序列化时应该发生什么。 应该保留旧值吗? 还是缓存版本覆盖旧版本?
你应该做什么:根本不要在 Serializable 类中使用 static 字段。 将它移到其他地方,或者更好的是,根本不要使用 static 成员/单身人士。 他们引入了全局 state,这可能会导致许多问题和糟糕的 OO 设计。
您可以通过 2 种方式解决此问题:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.