比如一段LinkedList里面的代码
    public E getFirst() {
        final Node<E> f = first;
        if (f == null)
            throw new NoSuchElementException();
        return f.item;
    }
加个final有什么好处?
写成这样不就行了:
    public E getFirst() {
        if (first == null)
            throw new NoSuchElementException();
        return first.item;
    }还有一些代码喜欢在catch(final Exception e)里面加final,又有什么内幕?final

解决方案 »

  1.   

    final声明的对象不可改变。。
    优势就是提高了安全性。。
      

  2.   

    我觉得你说的非常好,但是不能说服我
    没举例子不生动,可以举例子打字太多太累。。

    不可变的是f,内部变量不可变有什么用,就函数内部的几行代码,有必要设防吗?
    据说加了final会提高效率,因为如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的 final方法(这和具体的编译器实现有关)。
    虽然我从来没用自己测试过。
      

  3.   

    稍微搜索了一下,支持final修饰局部变量的,有三个说法:
    1、防止自己或者其他人修改变量,以避免失误写错。
    2、方法的内部类会将方法的局部final变量拷贝到自己的域中,从而可以用到局部变量
    3、便于编译器进行编译的优化。
    这里面,2这个说法是正确的,我看了class文件,确实final变量被编译到局部方法的内部类中取了。如果有这种应用场景,那只能如此了。1完全是编码风格问题,有的人喜欢final,有的人讨厌final。比如LinkedList里面到处是final变量,但是在Collections里面,根本没有一个final修饰局部变量。3的话,真没看出来。不管是不是final的,局部变量就是局部变量,占用的还是那个Slot,生命周期也是一样的,哪有什么效率差别。
      

  4.   

    除给内部类调用外,还有是API式的极限编程,不想被继承更改的,声明为final。
      

  5.   

    但就你说的这个例子来说,确实没必要final
      

  6.   

    难道我会告诉你,如果这里定义的是final,再编译后的代码会直接把这里变成是一个硬编码hardcode么