Приведет ли установка поля в классе в качестве нового экземпляра того же класса к переполнению памяти? Класс InetValidator (apache.commons)

#java #heap-memory

Вопрос:

Я использую InetValidator класс из apache.commons в своем проекте для проверки IP-адресов. При просмотре исходного кода,

 public class InetAddressValidator implements Serializable {
    private static final int IPV4_MAX_OCTET_VALUE = 255;
    private static final int MAX_UNSIGNED_SHORT = 65535;
    private static final int BASE_16 = 16;
    private static final long serialVersionUID = -919201640201914789L;
    private static final String IPV4_REGEX = "^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$";
    private static final int IPV6_MAX_HEX_GROUPS = 8;
    private static final int IPV6_MAX_HEX_DIGITS_PER_GROUP = 4;
    private static final InetAddressValidator VALIDATOR = new InetAddressValidator();
    private final RegexValidator ipv4Validator = new RegexValidator("^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$");

    public InetAddressValidator() {
    }

    public static InetAddressValidator getInstance() {
        return VALIDATOR;
    }
 

Я заметил, что есть VALIDATOR поле, которое снова вызывает конструктор.
Что меня смущает, так это то, что я создаю новый экземпляр этого класса как,

 InetAddressValidator addressValidator = new InetAddressValidator();
 

не будет ли он рекурсивно продолжать создавать новые экземпляры одного и того же класса (поскольку поле VALIDATOR каждый раз создает новый экземпляр), и в конечном итоге у меня закончится место в куче?

Я еще не тестировал это, но мне интересно, нужно ли это иметь в виду при тестировании.

Комментарии:

1. Вы можете наблюдать явный случай программиста здесь, в первых трех объявлениях: как будто кто-то собирается изменить максимальное значение октета , или максимальное значение без знака short , или 16.

Ответ №1:

 private static final InetAddressValidator VALIDATOR = new InetAddressValidator();
 

это статическое поле, поэтому оно будет создано только один раз во время загрузки класса, а не для каждого экземпляра в конструкторе.

Комментарии:

1. Ах, моя беда, не знаю, как я это упустил из виду. Спасибо!

Ответ №2:

Рекурсивный вызов

InetAddressValidator AddressValidator = новый InetAddressValidator(); Рекурсивный вызов