解决方案 »

  1.   

    用final,参数值不能被改变,也就是你只能读不能写入
      

  2.   

    Java 的final 参数没啥好处,不象c++, const 参数不能修改参数对象中的数据。
      

  3.   

    final就是防止你的参数在方法体内被修改,一般内部类用的比较多
      

  4.   

    能用final就就用final 很有优秀的框架 源码也是这么写的
      

  5.   

    看具体是什么参数了 如ID 身份证号码什么的,不容许在方法内重新赋值的方法建议用final修饰, 以防误改
      

  6.   

    内部类引用参数是必须用final修饰的,防止修改。
      

  7.   

    final修饰的就是完美的不可更改的。
      

  8.   

    我觉得如果在一个程序中,有一个变量的值不会变化,并且是全局变量的话,就最好用final,保证代码的安全性。
      

  9.   

    final基本类型吧,
    好像别的类型还是可以改内容,基本类型才有效果
      

  10.   

    用final修饰过之后,如果你在程序里有修改过这个参数的值,会得到编译错误,仅此而已
      

  11.   

    这个总结的不错,可以看看:
    final在Java中并不常用,然而它却为我们提供了诸如在C语言中定义常量的功能,不仅如此,final还可以让你控制你的成员、方法或者是一个类是否可被覆写或继承等功能,这些特点使final在Java中拥有了一个不可或缺的地位,也是学习Java时必须要知道和掌握的关键字之一。
    final成员
      当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。下面这段代码演示了这一点:
    import java.util.List;
    import java.util.ArrayList;
    import java.util.LinkedList;
    public class Bat{
        final PI=3.14;          //在定义时便给址值
        final int i;            //因为要在构造函数中进行初始化,所以此处便不可再给值
        final List list;        //此变量也与上面的一样
        Bat(){
            i=100;
            list=new LinkedList();
        }
        Bat(int ii,List l){
            i=ii;
            list=l;
        }
        public static void main(String[] args){
            Bat b=new Bat();
            b.list.add(new Bat());
            //b.i=25;
            //b.list=new ArrayList();
            System.out.println("I="+b.i+" List Type:"+b.list.getClass());
            b=new Bat(23,new ArrayList());
            b.list.add(new Bat());
            System.out.println("I="+b.i+" List Type:"+b.list.getClass());
        }
    }
      此程序很简单的演示了final的常规用法。在这里使用在构造函数中进行初始化的方法,这使你有了一点灵活性。如Bat的两个重载构造函数所示,第一个缺省构造函数会为你提供默认的值,重载的那个构造函数会根据你所提供的值或类型为final变量初始化。然而有时你并不需要这种灵活性,你只需要在定义时便给定其值并永不变化,这时就不要再用这种方法。在main方法中有两行语句注释掉了,如果你去掉注释,程序便无法通过编译,这便是说,不论是i的值或是list的类型,一旦初始化,确实无法再更改。然而b可以通过重新初始化来指定i的值或list的类型,输出结果中显示了这一点:
    I=100 List Type:class java.util.LinkedList
    I=23 List Type:class java.util.ArrayList
      还有一种用法是定义方法中的参数为final,对于基本类型的变量,这样做并没有什么实际意义,因为基本类型的变量在调用方法时是传值的,也就是说你可以在方法中更改这个参数变量而不会影响到调用语句,然而对于对象变量,却显得很实用,因为对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量,当你在方法中不需要改变作为参数的对象变量时,明确使用final进行声明,会防止你无意的修改而影响到调用方法。
    另外方法中的内部类在用到方法中的参变量时,此参变也必须声明为final才可使用,如下代码所示:
    public class INClass{
       void innerClass(final String str){
            class IClass{
                IClass(){
                    System.out.println(str);
                }
            }
            IClass ic=new IClass();
        }
      public static void main(String[] args){
          INClass inc=new INClass();
          inc.innerClass("Hello");
      }
    }
    final方法
      将方法声明为final,那就说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。另外有一种被称为inline的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。
    final类
      当你将final用于类身上时,你就需要仔细考虑,因为一个final类是无法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。
      下面的程序演示了final方法和final类的用法:
    final class final{
        final String str="final Data";
        public String str1="non final data";
        final public void print(){
            System.out.println("final method.");
        }
        public void what(){
            System.out.println(str+"\n"+str1);
        }
    }
    public class FinalDemo {   //extends final 无法继承 
        public static void main(String[] args){
            final f=new final();
            f.what();
            f.print();
        }
    }
      从程序中可以看出,final类与普通类的使用几乎没有差别,只是它失去了被继承的特性。final方法与非final方法的区别也很难从程序行看出,只是记住慎用。
    final在设计模式中的应用
      在设计模式中有一种模式叫做不变模式,在Java中通过final关键字可以很容易的实现这个模式,在讲解final成员时用到的程序Bat.java就是一个不变模式的例子。如果你对此感兴趣,可以参考阎宏博士编写的《Java与模式》一书中的讲解。
      

  12.   

    JAVA传参是传引用,你在程序里对参数的修改会影响到实参,所以设置为final可以防止你在程序中误操作修改实参
      

  13.   

    不用final的风险正如英文提示里面描述的一样:“Changing the value of parameters during the execution of the method's algorithm can be confusing and should be avoided. A great way to let the Java compiler prevent this coding style is to declare parameters final.”即是说,不使用final那么方法里面的代码就可以对该参数重新赋值。如果另一个不知道这个情况的人来维护这段代码,使用了这个被重新赋值的参数(他还以为就是传入的参数),势必会引起问题。可以说,不使用final会造成一个隐患,但不一定出问题。但是使用final,也只能解决一半的问题。对于非基本类型,非不可变类型(如String),可能直接调用该对象的方法改变他的值,比如set方法,而这个时候final是起不到作用的。个人观点:
    1. 参数加final有效,但并不是那么的有效
    2. 参数加final让代码冗长,看上去非常不舒服,影响可读性
    3. 个人更偏向于不加final