36

オンライン:

private boolean someFlag;

次の PMD 警告が表示されます。

非一時的で非静的なメンバーが見つかりました。一時的なものとしてマークするか、アクセサーを提供してください。

誰かがこの警告がある理由とその意味を説明できますか? (修正方法はわかりますが、なぜそこにあるのかわかりません...)

他の多くのメンバー宣言でもこれを取得しています...


編集:私のクラスは間違いなくBeanではなく、シリアル化できません...

4

5 に答える 5

9

あなたのクラスは、定義により を実装する Bean であると想定していますSerializable。一時変数はシリアル化プロセスから除外されます。Bean をシリアライズしてからデシリアライズすると、値は実際にはデフォルト値になります。

PMD は、ここでシリアライズ可能な Bean を扱っていると想定しています。Bean の場合、すべてのメンバー変数にゲッター/セッターがあることが期待されます。これらを省略したため、メンバー変数が Bean の一部ではないことを暗示しているため、シリアル化する必要はありません。その場合は、シリアル化から除外する必要があります。変数を「一時的」としてマークすることでこれを行います。

于 2009-02-26T10:09:08.250 に答える
8

今、私はそれを取得します。

この定義を追加した後:

private boolean someFlag;

...ここで何が起こるかは明らかです:

このエラー メッセージは、アクセスしているスキーマを参照しています。PMD は、Bean によって参照されるクラスも Bean スキーマに従う必要があると述べています。

MyBean.referredClass.someFlagに変換されるようなプロパティ スタイルのアクセスをサポートする可能性が最も高いsomeObject.getReferredClass().getSomeFlag()

PMD は、その値に直接アクセスするのではなく、その値にアクセスできるisSomeFlag/getSomeFlagandメソッドがあることを期待しています。setSomeFlag

Found non-transient, non-static member. Please mark as transient **or provide accessors**.
于 2009-02-26T22:27:21.140 に答える
6

ここで起こっているルールを参照してください

BeanMembersShouldSerialize

クラスが Bean であるか、Bean によって直接的または間接的に参照される場合、シリアライズ可能である必要があります。メンバー変数は、一時的、静的としてマークするか、クラスにアクセサー メソッドを含める必要があります。変数を一時的としてマークすることは、最も安全で簡単な変更です。アクセサ メソッドは、Java の命名規則に従う必要があります。つまり、変数 foo がある場合は、getFoo および setFoo メソッドを提供する必要があります。

于 2009-02-26T09:59:07.663 に答える
2

トランジェントは、ストリーム/ディスクにクラスを書き込むときに無視する必要があるjvmシリアライゼーションへのヒントとして使用されます。したがって、インスタンスが復元されてメモリ内のオブジェクトになると、フィールドは null になります。

静的メンバーの問題は、一度にメモリ内に 1 つしか存在しないことです。したがって、デシリアライズ時に何が起こるべきかは完全には明らかではありません。古い値を保持する必要がありますか? またはキャッシュされたバージョンが古いバージョンを上書きしますか?

何をすべきか: シリアライズ可能なクラスでは静的フィールドをまったく使用しないでください。別の場所に移動するか、さらに良いことに、静的メンバー/シングルトンをまったく使用しないでください。それらはグローバルな状態を導入し、多くの問題や不適切な OO 設計につながる可能性があります。

于 2009-02-26T09:58:34.857 に答える