簡體   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