Концепция создания статического финала класса в 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. Статический элемент - это один и тот же член во всех экземплярах класса и самого класса.

Другие вопросы по тегам