将 class 中的字段设置为相同 class 的新实例会导致内存溢出吗? InetValidator class (apache.commons)
Would setting a field in a class as a new instance of the same class cause memory overflow? InetValidator class (apache.commons)
我在我的项目中使用 apache.commons 中的 InetValidator
class 来验证 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
字段再次调用构造函数。
我感到困惑的是,如果我创建这个 class 的新实例,
InetAddressValidator addressValidator = new InetAddressValidator();
它不会递归地继续创建相同 class 的新实例(因为字段 VALIDATOR
每次都会创建一个新实例)并且最终我会 运行堆 space?
我还没有测试过这个,但想知道这是否是我在测试时必须记住的事情。
private static final InetAddressValidator VALIDATOR = new InetAddressValidator();
它是一个静态字段,因此它只会在 class 加载时实例化一次,而不是在构造函数中按实例实例化。
Recursive call
InetAddressValidator addressValidator = new InetAddressValidator();递归调用
我在我的项目中使用 apache.commons 中的 InetValidator
class 来验证 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
字段再次调用构造函数。
我感到困惑的是,如果我创建这个 class 的新实例,
InetAddressValidator addressValidator = new InetAddressValidator();
它不会递归地继续创建相同 class 的新实例(因为字段 VALIDATOR
每次都会创建一个新实例)并且最终我会 运行堆 space?
我还没有测试过这个,但想知道这是否是我在测试时必须记住的事情。
private static final InetAddressValidator VALIDATOR = new InetAddressValidator();
它是一个静态字段,因此它只会在 class 加载时实例化一次,而不是在构造函数中按实例实例化。
Recursive call
InetAddressValidator addressValidator = new InetAddressValidator();递归调用