将 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();递归调用