final 关键字与保证集合的域安全

一、final 关键字

1.1 定义

​ final 关键字用来修饰不再发生变化的量,可以用来修饰类,属性,方法,局部变量。

1.2 使用

修饰类:final 修饰类表示该类无法被继承,表明该类已经很完善了,我们很难再对该类进行扩充。

​ 典型应用:String,StringBuffer,System

修饰属性:final 修饰属性表示该属性一旦被初始化则无法改变,所以 final 修饰的属性要在对象的初始化完成之前完成,可以初始化的位置有显示初始化、代码块中初始化、构造器中初始化

例:

class Person {
    final int age = 10;	//显示初始化
    final String name;	
    final String sex;
    
    {
        name = "xiao ming";	//代码块初始化
    }
    
    public Person() {
        sex = "男";	//构造变量初始化
    }
}

修饰方法:final 修饰方法表明该方法不能再被子类重写,典型的使用有 Object 类的 getClass() 方法。

修饰局部变量:可以修饰基本数据类型和引用数据类型,修饰基本数据类型表示它不可以修改值,修饰引用数据类型的变量表明它不可以修改地址值,即指向。

二、集合的域安全

2.1 定义

​ 保证集合中的元素不可变就是域安全。

​ 上面在提到提到了 final 修饰引用数据类型的变量,表明它不可以指向新的对象, 对于数组同样适用,但是,我们在使用数组的时候,可能不止想保证不更改数组的引用,而且也不想更改数组中的内容,这点 final 是做不到的。

例:

public class FinalTest {
    private static void output(final List<Integer> arrayList) {
        for(int i = 0; i < arrayList.size(); i++) {
            System.out.print(arrayList.get(i) + " ");
            arrayList.set(i, arrayList.get(i) + 1); //对 arrayList 中的元素更改
        }
    }

    public static void main(String[] args) {
        final List<Integer> arrayList = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));	//定义 final 类型的 List
        output(arrayList);
        System.out.println();
        output(arrayList);

    }

}
/*结果:
1 2 3 4 5 
2 3 4 5 6 
*/

2.2 使用

​ 为了保证域安全,在 C 语言中可以使用 const 关键字,在 java 中,需要使用不可变类来对集合进行包装:

public static void main(String[] args) {
    final List<Integer> arrayList = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)));
    output(arrayList);
    System.out.println();
    output(arrayList);

}
/*结果:
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.Collections$UnmodifiableList.set(Collections.java:1311)
	at static_final.FinalTest.output(FinalTest.java:9)
	at static_final.FinalTest.main(FinalTest.java:15)
*/

发布了42 篇原创文章 · 获赞 3 · 访问量 2052

猜你喜欢

转载自blog.csdn.net/stable_zl/article/details/105016026