代码之家  ›  专栏  ›  技术社区  ›  usertest

findbugs报告关于我的项目代码的这些错误。为什么?

  •  3
  • usertest  · 技术社区  · 7 年前

    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() . 为什么会这样?

    2 回复  |  直到 7 年前
        1
  •  2
  •   GhostCat    7 年前

    显式声明包含类以实现可序列化。

    因此,拥有会导致序列化失败的字段可能是个问题。

    并且该方法返回原始数组,因此该方法的任何调用方都可以更改该内部实现细节的状态。

    对于这两种方法的区别,只需做一些研究,比如阅读 Difference between parseInt and valueOf in java?

    这就是全部。

        2
  •  2
  •   cello    7 年前

    你们班 ChannelBean 器具 Serializable . 为了使一个类(或者更好:该类的一个对象)可以序列化,它的所有字段也必须是可序列化的。findbugs警告您类中的一个字段 菜豆 不可序列化,在这种情况下,您的ejb SubscriptionDao . 如果您试图序列化channelbean,它很可能会导致运行时异常,因为它无法序列化它,因为ejb不可序列化。

    修理它,要么 下标 可序列化,或使 菜豆 不实现可序列化。


    公开内部表示: 直接返回数组。该数组的任何接收器都可能覆盖其中的值,例如:

    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 )

    推荐文章