Концепция создания статического финала класса в Java
Я новичок в 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, тогда ни один подкласс не сможет расширить конечный класс. В коде "Выше" способ объявления - это нечто иное, это меня не смутило.
4 ответа
private static final ParentClass ourInstance=new ParentClass();
Когда вы объявляете поле класса как окончательное, вы не можете переназначить его значение после инициализации.
Это означает, что вы не можете выполнить следующий код:
ParentClass otherInstance = new ParentClass();
ourInstance = otherInstance; // Not allowed as ourInstance is final.
Но вы можете выполнить следующие операции, т.е. вы можете изменить поля ourInstance, вызвав его методы установки: - Например,
ourInstance.setSomeMethod(someValue); // Allowed as you are not modifying object's reference but only its properties which are not final.
Я знаю, когда мы сможем сделать класс Final, тогда ни один подкласс не сможет расширить финальный класс.
Правда. Но в вашем коде final
применяется к полю, что означает, что это статическое поле ourInstance
не будет изменен, т. е. не будет переназначен другому экземпляру.
Причина по которой static
применяется здесь:
private static final ParentClass ourInstance = new ParentClass();
работает с
public static ParentClass getinstance() {
return ourInstance;
}
private ParentClass() {
}
реализовать шаблон проектирования Singleton.
То, что вы делаете, это "Вы создаете константу класса", слово финал в этом контексте используется для создания константы. Кроме того, он статичен, поэтому нет необходимости создавать экземпляр для доступа к нему.
Вы создаете его экземпляр там, где он объявлен, потому что вы не можете сделать это снаружи, так как ваш конструктор является приватным. Так что доступ к экземпляру этого класса возможен только с помощью вызова getInstance, и этот уже созданный экземпляр доступен. Снаружи невозможно создать экземпляр. Таким образом, вы создаете синглтон, значит, только один экземпляр этого класса будет создан в ВМ.
Поскольку ключевое слово static включено, значение будет постоянным для всех объектов класса. Закрытое конечное значение переменной будет похоже на константу для каждого объекта. Вы можете ссылаться на java.lang.String. Статический элемент - это один и тот же член во всех экземплярах класса и самого класса.