software que java coding-style pmd

que - Advertencia de Java PMD en miembro de clase no transitoria



pmd que es (4)

Supongo que su clase es un bean que, por definición, implementa Serializable . Una variable transitoria será excluida del proceso de serialización. Si serializa y luego deserializa el bean, el valor tendrá realmente el valor predeterminado.

PMD asume que está tratando con un bean serializable aquí. Para un bean, se espera que tenga getters / setters para todas las variables miembro. Como los ha omitido, implica que su variable miembro no es parte del bean ... y por lo tanto no necesita ser serializado. Si ese es el caso, debe excluirlo de la serialización. Lo que haces marcando la variable como "transitoria".

En linea

private boolean someFlag;

Recibo la siguiente advertencia de PMD:

Encontrado miembro no transitorio, no estático. Por favor, marque como transitorio o proporcione accesores.

¿Puede alguien explicar por qué esta advertencia está ahí y qué significa? (Entiendo cómo solucionarlo, no entiendo por qué está ahí ...)

También estoy recibiendo esto en muchas otras declaraciones de miembros ...

EDIT: Mi clase definitivamente no es un bean, y no serializable ...


Vea la regla que está sucediendo here

FrijolMiembrosDebería Serializar

Si una clase es un bean, o es referenciada por un bean directa o indirectamente, debe ser serializable. Las variables de los miembros deben marcarse como métodos transitorios, estáticos o tener métodos de acceso en la clase. Marcar las variables como transitorias es la modificación más segura y fácil. Los métodos de acceso deben seguir las convenciones de nomenclatura de Java, es decir, si tiene una variable foo, debe proporcionar los métodos getFoo y setFoo.


ok ahora lo entiendo después de agregar la definición

private boolean someFlag;

está claro lo que pasa aquí:

este mensaje de error hace referencia al esquema de acceso. PMD indica que las clases a las que hacen referencia los beans también deben seguir el esquema del bean.

lo más probable es que admita el acceso de estilo de propiedad como MyBean.referredClass.someFlag se traducirá a someObject.getReferredClass (). getSomeFlag ()

PMD espera que exista un método isSomeFlag () / getSomeFlag () y setSomeFlag () mediante el cual puede acceder a su valor y no acceder a él directamente.

Found non-transient, non-static member. Please mark as transient **or provide accessors**.


transient se utiliza como una sugerencia para la serialización jvm que debe ignorar al escribir una clase en un flujo / en el disco. por lo que si su instancia se recupera y se convierte en un objeto en la memoria, el campo será nulo.

El problema con los miembros estáticos es que solo hay uno de ellos en la memoria a la vez. por lo tanto, no está del todo claro qué debería suceder con la deserialización. ¿Debería mantenerse el valor antiguo? ¿O la versión en caché sobrescribe la anterior?

lo que debe hacer: no utilice campos estáticos en clases serializables en absoluto. muévalo a otro lugar, o mejor aún, no use miembros / singletons estáticos en absoluto. introducen un estado global que puede llevar a numerosos problemas y mal diseño de OO.