找出构造函数是否成功执行

时间:2018-03-18 16:23:41

标签: java constructor

所以我再一次在java中玩游戏,在这样做时,我遇到了一个有趣的问题。

我试图给自己写一点注册服务。如果某个类型的对象通过其构造函数实例化,它将从我的注册服务中检索一个id并添加到对象的服务列表中。

这是一个示例对象

public class Test {

  private final Long id;

  public Test() {
    this.id = TestRegistration.register(this);
    throw new IllegalAccessError();
  }

  public Long getId() {
    return this.id;
  }
}

这是一个示例服务

public class TestRegistration {

  private final static Map<Long, Test> registration = new HashMap<>();

  protected final static long register(final Test pTest) {
    if (pTest.getId() != null) {
        throw new IllegalStateException();
    }
    long freeId = 0;
    while (registration.containsKey(freeId)) {
        freeId = freeId + 1;
    }
    registration.put(freeId, pTest);
    return freeId;
  }

  protected final static Test get(final long pId) {
    return registration.get(pId);
  }
}

现在您可以看到,我的班级Test的构造函数根本无法成功执行,因为它始终会抛出IllegalAccessError。但是在抛出此错误之前,在构造函数中调用register(...)类的方法TestRegistration。在此方法中,它会添加到注册Map中。所以如果我想运行这个代码

public static void main(final String[] args) {
    try {
        final Test t = new Test();
    } catch (final IllegalAccessError e) {

    }
    final Test t2 = TestRegistration.get(0);
    System.out.println(t2);
}

我的TestRegistration确实包含了我的Test类的构造函数被调用时创建的对象,我可以(这里使用变量t2)访问它,即使它不是&# 39; t首先成功创建。

我的问题是,我可以以某种方式从我的TestRegistration类中检测Test的构造函数是否成功执行而没有任何异常或其他中断?

在你问我为什么抛出这个例外之前,这是我的答案。测试可能有潜在的子类我还不知道,但仍会在我的TestRegistration类中注册。但由于我不会对这些子类的结构产生影响,我无法判断它们的构造函数是否会抛出异常。

1 个答案:

答案 0 :(得分:0)

天气与否构造函数comples不会影响对象是否被创建。将创建所有实例变量,仍将调用super()并仍将分配内存。

实际上,将始终抛出异常,注册服务中的每个对象都会抛出异常。由于孩子必须调用super()才能进行注册,并且在注册后会抛出异常。