findbugs сообщает об этих ошибках о моем коде проекта.Зачем? - PullRequest
0 голосов
/ 23 декабря 2018

findbugs сообщает об этих ошибках о коде моего проекта.

class channelBean defines non-transient non-serializable instance field subscriptionDao
in ChannelBean.java
Field com.derbyware.qtube.beans.ChannelBean.subscriptionDao
Actual type com.derbyware.qtube.dao.SubscriptionDao 

Код:

@Named
@ViewScoped
public class ChannelBean extends BaseBacking implements Serializable {
    private static final long serialVersionUID = 1L;

    @EJB
    private SubscriptionDao subscriptionDao;

Почему говорится, что мой EJB должен быть сериализуемым?Я никогда раньше не сталкивался с такой рекомендацией.

И

getCorrectAnswerTwo() Может открывать внутреннее представление, возвращая ссылку на изменяемый объект. Код:

public String[] getCorrectAnswerTwo() {
        return correctAnswerTwo;
    }

Мне нужно отобразитьмассив в страницах jsf.Так почему инструмент сообщает, что это проблема.

AND

setCorrectAnswers Может отображать внутреннее представление путем включения ссылки на изменяемый объект

public void setCorrectAnswers(String[] correctAnswers) {
        this.correctAnswers = correctAnswers;
    }

AND

он говорит, что я должен использовать Integer.parseInt() вместо Integer.valueOf().Почему это так?

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Ваш класс ChannelBean реализует Serializable.Для того чтобы класс (или лучше: объект этого класса) был сериализуемым, все его поля также должны быть сериализуемыми.FindBugs предупреждает вас, что одно поле вашего класса ChannelBean не сериализуемо, в этом случае ваш EJB SubscriptionDao.В случае, если вы когда-нибудь попытаетесь сериализовать ChannelBean, это, скорее всего, приведет к исключению во время выполнения, поскольку он не сможет его сериализовать из-за невозможности сериализации EJB-компонента.

Чтобы исправить это, либо выполните SubscriptionDao serializable, или сделать ChannelBean не реализующим Serializable.


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

String[] answers = object.getCorrectAnswers();
answers[0] = "My Answer";

сейчас, «Мой ответ» будет правильным ответом И будет возвращен в будущих вызовах getCorrectAnswer().

Случай с setCorrectAnswer() аналогичен:

String [] answers = new String [] {"Foo"};object.setCorrectAnswers (ответы);answers [0] = "Бар";

Теперь "Бар" будет правильным ответом.

Чтобы исправить это, обычно лучше сохранить копию / клон массива, поэтомуего нельзя изменить извне.


Integer.valueOf() создает новый объект, а Integer.parseInt() - нет.Таким образом, второе является минимально более эффективным, так как не требует дополнительных затрат памяти.(хотя хорошая JVM может его оптимизировать, поэтому разница, скорее всего, не измерима, но все же лучше использовать parseInt).

0 голосов
/ 23 декабря 2018

Вы явно объявляете содержащий класс для реализации Serializeable.

Таким образом, наличие полей, вызывающих сбой сериализации, вероятно, является проблемой.

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

Чтобы узнать разницу между этими двумя методами, просто проведите некоторое исследование, например, прочитав Разница между parseInt и valueOf в Java?

Это все, что нужно для этого.

...