携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
在apache shenyu社区的编码规范中,有一条内容为:方法参数前面必须使用final
关键字修饰。那么为什么要这么约定,这么做有什么好处呢?本文对方法参数final修饰的情况进行分析。
1.修饰基本类型
所修饰的方法参数值在方法体内不能被修改,即不能被重新赋值。如果被修改则编译不通过。
private static void testBasic(final int a) {
//a = 10;
}
上述代码,注释中的内容,去掉注释符号后会报错。 提示:
Cannot assign a value to final variable 'a'
2.修饰引用类型
与基本类型一样,引用类型的所引用的对象是不能改变的。如果重新赋值,则idea会报错。但是引用对象本身的内容可以发生改变,如下所示,可以对被引用的对象如集合,进行对应的集合操作。
private static void testReference(final List<String> list) {
//list = new ArrayList();
list.add("11");
}
上述代码,list是不能被重新赋值的,但是list本身,可以增加内容。
3.对比和总结
通过final修饰两种类型的参数可以发现,final修饰方法参数的好处在于,将方法内传入的参数进行固化。避免在使用的过程中,被误操作或者改动。有如下代码:
package com.dhb;
import java.util.ArrayList;
import java.util.List;
public class FinalTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("10");
List<String> result1 = testFinal("11", list);
System.out.println(list);
System.out.println(result1);
list = new ArrayList();
list.add("10");
List<String> result2 = testNotFinal("13", list);
System.out.println(list);
System.out.println(result2);
}
private static List<String> testNotFinal(String a, List<String> list) {
a = "12";
list.add(a);
list = new ArrayList<>();
return list;
}
private static List<String> testFinal(final String a, final List<String> list) {
list.add(a);
return list;
}
}
上述代码输出结果:
[10, 11]
[10, 11]
[10, 12]
[]
Process finished with exit code 0
可以看出,通过final修饰的最大好处就是在于,防止在方法体中,将方法参数改变。防止在方法里面不小心重新赋值,造成一些不必要的麻烦。从而保证参数的一致性。因此建议在方法参数前面必须使用final关键字修饰的规范也是合适的。 但是需要注意的是,final修饰引用类型,被修饰的对象,还是可以再进行更改,如本文中对list的操作,list的内容是可以被改变的。 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。