在Java中生成类静态Final背后的概念



我是Java的新手,在学校级别,我有一个查询,任何人都可以更好地向我解释它背后的概念、它的含义、何时使用以及为什么。

public class ParentClass {
private static final ParentClass ourInstance=new ParentClass();
private ArrayList<Integer> arr=new ArrayList<>();
public static ParentClass getinstance() {
return ourInstance;
}
private ParentClass() {
}
public void setList(ArrayList<Integer> al) {
arr.addAll(al);
}
public ArrayList<Integer>  getList(){
return arr;
}
}

我想把重点放在private static final ParentClass ourInstance=new ParentClass();这一行上,它的含义是什么?当我们必须这样声明语法时?我知道我们可以使类Final,然后没有子类可以扩展最终类。在上面的代码中,声明的方式是不同的,这让我很困惑。

private static final ParentClass ourInstance=new ParentClass();

当您将类的字段声明为final时,初始化后不能重新分配其值。

这意味着你不能执行以下代码:

ParentClass otherInstance = new ParentClass();
ourInstance = otherInstance;   // Not allowed as ourInstance is final.

但您可以执行以下操作,即您可以通过调用其setter方法来更改ourInstance的字段:-例如

ourInstance.setSomeMethod(someValue);   // Allowed as you are not modifying object's reference but only its properties which are not final.

您正在做的是"您正在创建类常量",这个上下文中的单词final用于创建常量。还有它的静态,所以不需要创建一个实例来访问它

您正在声明的地方实例化它,因为您不能在外部执行,因为您的构造函数是私有的。因此,只有通过调用getInstance才能访问这个类的实例,那个已经创建的实例是可以访问的。在外部无法创建实例。通过这种方式创建singleton,意味着在VM中只会创建此类的一个实例。

我知道什么时候我们可以使类Final,那么没有子类可以扩展Final类。

正确。但在您的代码中,final应用于字段,这意味着这个静态字段ourInstance不会被修改,也就是说,它不会被重新分配给另一个实例。

此处应用static的原因:

private static final ParentClass ourInstance = new ParentClass();

正在使用

public static ParentClass getinstance() {
return ourInstance;
}
private ParentClass() {
}

以实现单例设计模式。

最新更新