findbugs报告有关我的项目代码的这些bug。
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应该可序列化?我以前从未遇到过这样的建议。
AND
getCorrectAnswerTwo()
可以通过返回对可变对象的引用来公开内部表示形式
代码:
public String[] getCorrectAnswerTwo() {
return correctAnswerTwo;
}
我需要在jsf页面中显示数组。那么为什么该工具报告这是一个问题。
AND
setCorrectAnswers可能通过合并对可变对象的引用来公开内部表示形式
public void setCorrectAnswers(String[] correctAnswers) {
this.correctAnswers = correctAnswers;
}
AND
它说我应该使用Integer.parseInt()
而不是Integer.valueOf()
。为什么会这样?
答案 0 :(得分:2)
您显式声明了包含类以实现Serializeable。
因此拥有可能导致序列化失败的字段可能是一个问题。
并且该方法返回原始数组,因此该方法的任何调用者都可以更改该内部实现详细信息的状态。
对于这两种方法之间的区别,只需进行一些研究,例如阅读Difference between parseInt and valueOf in java?
这就是全部。
答案 1 :(得分:2)
您的类ChannelBean
实现Serializable
。为了使一个类(或更优:该类的一个对象)可序列化,其所有字段也必须可序列化。 FindBugs警告您类ChannelBean
的一个字段不可序列化,在这种情况下是您的EJB SubscriptionDao
。
万一您尝试序列化ChannelBean,很可能会导致运行时异常,因为由于EJB无法序列化而无法序列化。
要解决此问题,请使SubscriptionDao
可序列化,或使ChannelBean
不实现可序列化。
公开内部表示形式: 您直接返回数组。该数组的任何接收者都可以覆盖其中的值,例如:
String[] answers = object.getCorrectAnswers();
answers[0] = "My Answer";
现在,“我的答案”将是正确的答案,并将在以后调用getCorrectAnswer()
时返回。
与setCorrectAnswer()
相似的情况是
String []答案=新的String [] {“ Foo”}; object.setCorrectAnswers(answers); answers [0] =“酒吧”;
现在,“ Bar”将是正确的答案。
要解决的是,通常最好存储阵列的副本/克隆,因此无法再从外部进行修改。
Integer.valueOf()
创建一个新对象,而Integer.parseInt()
没有创建。因此,第二种方法效率最低,因为它没有内存分配的开销。 (尽管一个好的JVM可能会对其进行优化,所以差异可能无法测量,但是仍然更倾向于使用parseInt
)。