#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(); Рекурсивный вызов