首页 > 解决方案 > 将类中的字段设置为同一类的新实例会导致内存溢出吗?InetValidator 类 (apache.commons)

问题描述

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每次都会创建一个新实例)并且最终我会用完堆空间吗?

我还没有对此进行测试,但想知道这是否是我在测试时必须牢记的事情。

标签: javaheap-memory

解决方案


private static final InetAddressValidator VALIDATOR = new InetAddressValidator();

它是一个静态字段,因此它只会在类加载时实例化一次,而不是在构造函数中的每个实例。


推荐阅读