Java中的publicstaticfinal来修饰数组与接⼝变量
Java中的public static final来修饰数组与接⼝变量
public static final来修饰数组
举个栗⼦:
public class A{
public static final String[] head = new String[]{"hello",“java”};
}
上述的代码⽚段在使⽤的时候是不会有什么问题的,但是如果你使⽤SonarLint进⾏检查,就会发现这句代码有⼀个漏洞。
There is no good reason to have a mutable object as the public (by default), static member of an interface. Such variables should be moved into classes and their visibility lowered.Similarly, mutable static members of classes and enumerations which are accessed directly, rather than through getters a
nd setters, should be protected to the degree possible. That can be done by reducing visibility or making the field final if appropriate.
Note that making a mutable field, such as an array, final will keep the variable from being reassigned, but doing so has no effect on the mutability of the internal state of the array (i.e. it doesn’t accomplish the goal).
This rule raises issues for public static array, Collection, Date, and awt.Point members.
总结就⼀句话:这是⼀个可变对象,但是你设置成了public类型,这个会造成安全漏洞。
既然我们使⽤了 final 关键字,肯定⽬的就是想要⼀个不可变的“变量”,那为什么会有安全漏洞呢?
final对数组的作⽤
对于最初的那句代码:由于数组是可变对象,因此最终约束要求仅将数组对象本⾝分配⼀次,但不能保证数组元素的值。由于数组是公共的,因此恶意程序可以更改存储在数组中的值。因此,在⼤多数情况下,声明为public,final和static的数组是⼀个错误。
java中⽤final修饰变量表⽰该变量⼀旦初始化后将不可改变,它只是说明指向该对象的指针不变,对于
常量对象来说这点是成⽴的,但对于数组来说就不成⽴了。也就是说,final只能保证基本数据类型或原始数据类型不可变,不能保证引⽤类型不可变。
所以我们在使⽤final修饰引⽤类型时需要注意去保护其内容也不能改变,这样final才有意义。
简单⼀句:对数组使⽤final,只能是保证指向那个地址的指针不变了,但不能保证那个地址⾥的东西不会变了。
怎样实现对数组的public static final作⽤
1、将public数组设置为private,保护起来
private static final String[] head = new String[]{"hello",“java”};
2、转换为⾮可变列表
public static final List head= Collections.unmodifiableList(Arrays.asList(head));
在其他类中通过类直接调⽤该变量时调⽤List⽽不是直接调⽤Array。这个时候若有不法分⼦想改变值就会抛出
java.lang.UnsupportedOperationException的异常。
实例
调⽤的时候
ClassName.(0); //得到具体的数组
ClassName.(0)[0]; //得到具体的数组的0位置的值
public static final修饰接⼝变量
接⼝中的成员变量,需要使⽤public static final来修饰,为什么呢?
简单聊聊接⼝
接⼝,可以说是Java中的顶级抽象。它⾥⾯有三种类型的⽅法:
static修饰的变量1、普通⽅法(默认⽅法):使⽤default修饰的接⼝⽅法,可以拥有⽅法体,可以被实现类继承,该特性是Java8以后被提出;
2、静态⽅法:接⼝中的静态⽅法和普通类中的⼀样,是拥有⽅法体的;
3、抽象⽅法:⽆实现逻辑,实现逻辑交给接⼝的实现类;
但是这三个⽅法有⼀个共同特点,就是不可改变。
为什么要使⽤final
对于接⼝中的变量和⽅法也是⼀样的,不可变,所以⽤final。
反过来想,接⼝设计出来就是被众多的类来实现的,如果是可变的,⼤家都去改⼀改,岂不是乱套了。这就是final的必要性。
为什么⽤static
我们在普通类中使⽤static变量,⼤部分都是为了可以使⽤类名直接调⽤。同样的,在接⼝中的变量也是⼀样的,可以直接使⽤接⼝名进⾏调⽤。
我们知道Java是单继承的,⼀个类只能有⼀个⽗类,它的“多继承”功能是通过接⼝实现的,⼀个类可以实现多个接⼝。那么问题来了,⼀个类如果实现了多个接⼝,这多个接⼝中要是都有⼀个名为A的变量,那怎么保证不混淆呢?就是通过接⼝名来调⽤,这就是static的必要性。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论