Подтвердить что ты не робот

Предупреждение Java PMD о непереходном классе

В строке:

private boolean someFlag;

Я получаю следующее предупреждение PMD:

Найден непереходный, нестатический член. Пожалуйста, отметьте как переходный период или предоставите доступа.

Может кто-нибудь объяснить, почему это предупреждение есть и что это значит? (Я понимаю, как это исправить, я не понимаю, почему это там...)

Я получаю это и во многих других объявлениях участников...


EDIT: Мой класс определенно не является bean, а не сериализуемым...

4b9b3361

Ответ 1

Я предполагаю, что ваш класс является bean, который по определению реализует Serializable. Переходная переменная будет исключена из процесса сериализации. Если вы сериализуете и затем десериализуете bean, то на самом деле значение будет иметь значение по умолчанию.

PMD предполагает, что вы имеете дело с сериализуемым bean здесь. Для bean ожидается, что для всех переменных-членов будут установлены геттеры/сеттеры. Поскольку вы опустили их, вы подразумеваете, что ваша переменная-член не является частью bean.... и поэтому ее не нужно сериализовать. Если это так, вы должны исключить его из сериализации. Что вы делаете, отмечая переменную как "переходную".

Ответ 2

См. правило, которое происходит здесь

BeanMembersShouldSerialize

Если класс является bean или ссылается на bean прямо или косвенно, он должен быть сериализуемым. Переменные участника должны быть помечены как переходные, статические или иметь методы доступа в классе. Маркировка переменных как переходных является самой безопасной и простой модификацией. Методы Accessor должны соответствовать соглашениям об именах Java, т.е. Если у вас есть переменная foo, вам следует предоставить методы getFoo и setFoo.

Ответ 3

ОК, теперь я понял. после добавления определения

private boolean someFlag;

ясно, что здесь происходит:

это сообщение об ошибке относится к схеме доступа. PMD утверждает, что классы, на которые ссылается beans, также должны следовать схеме bean.

Скорее всего, для поддержки доступа к свойствам типа MyBean.referredClass.someFlag будет переведен в someObject.getReferredClass(). getSomeFlag()

PMD ожидает, что существует метод isSomeFlag()/getSomeFlag() и setSomeFlag(), с помощью которого вы можете получить доступ к его значению и не обращаться к нему напрямую.

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

Ответ 4

transient используется как подсказка для сериализации jvm, что он должен игнорировать его при записи класса в потоке/на диск. поэтому, если ваш экземпляр восстановлен и станет объектом в памяти, поле будет null.

проблема со статическими членами, есть только один из них в памяти за раз. поэтому не совсем ясно, что должно произойти при десериализации. следует сохранить старую ценность? или кешированная версия перезаписывает старый?

что вы должны делать: не используйте статические поля в классах Serializable вообще. переместить его в другое место или, еще лучше, не использовать статические элементы/одиночные игры вообще. они вводят глобальное состояние, которое может привести к многочисленным проблемам и плохому проектированию OO.