方法参数前面必须使用final关键字修饰的理解

携手创作,共同成长!这是我参与「掘金日新计划 · 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关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。

猜你喜欢

转载自juejin.im/post/7127180095235555365