[英]findbugs reports these bugs about my project code. Why?
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頁面中顯示數組。 那么為什么該工具報告這是一個問題。
和
setCorrectAnswers可以通過合並對可變對象的引用來公開內部表示
public void setCorrectAnswers(String[] correctAnswers) {
this.correctAnswers = correctAnswers;
}
和
它說我應該使用Integer.parseInt()
而不是Integer.valueOf()
。 這是為什么?
您顯式聲明包含類以實現Serializeable。
因此,有序列化失敗的字段可能是個問題。
並且該方法返回原始數組,因此該方法的任何調用者都可以更改該內部實現細節的狀態。
對於這兩種方法的區別,只需做一些研究,比如閱讀java中parseInt和valueOf之間的區別?
這就是全部。
您的ChannelBean
類實現了Serializable
。 為了使類(或更好:該類的對象)可序列化,其所有字段也必須是可序列化的。 FindBugs警告您,類ChannelBean
一個字段不可序列化,在本例中是您的EJB SubscriptionDao
。 如果您嘗試序列化ChannelBean,它很可能會導致運行時異常,因為它無法序列化,因為EJB不可序列化。
要修復它,要么使SubscriptionDao
序列化,要么使ChannelBean
不實現Serializable。
公開內部表示:直接返回數組。 該陣列的任何接收器都可以覆蓋其中的值,例如:
String[] answers = object.getCorrectAnswers();
answers[0] = "My Answer";
現在,“我的答案”將是一個正確的答案,它將在將來調用getCorrectAnswer()
。
setCorrectAnswer()
情況類似:
String [] answers = new String [] {“Foo”}; object.setCorrectAnswers(答案); 答案[0] =“酒吧”;
現在,“Bar”將是正確答案。
要修復它,通常最好存儲一個數組的副本/克隆,因此不能再從外部修改它。
Integer.valueOf()
創建一個新對象,而Integer.parseInt()
則不創建。 所以第二個是最低效的,因為它沒有內存分配的開銷。 (雖然一個好的JVM可能會對它進行優化,因此差異可能無法衡量,但仍然可以很好地使用parseInt
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.