繁体   English   中英

Java 非瞬态 class 成员的 PMD 警告

[英]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/getSomeFlagsetSomeFlag方法,您可以通过它访问它的值,而不是直接访问它。

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 种方式解决此问题:

  1. 为成员添加 getter 和 setter 方法。
  2. 使用构造函数添加 final 以设置成员的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM