gpt4 book ai didi

java - 检查实例方法是从构造函数调用的

转载 作者:搜寻专家 更新时间:2023-10-31 20:27:13 25 4
gpt4 key购买 nike

我想从非最终类的实例方法中检查该类的构造函数和初始值设定项及其特定实例的子类链是否已经完成。

在下面的示例中,我有一个类 Abstract,它可用于实现允许添加监听器的接口(interface)(为简单起见,它只是 Runnable 此处的实例),它提供了一个方法 signalEvent() 调用所有附加的监听器。

abstract class Abstract {
protected final void signalEvent() {
// Check that constructs have run and call listeners.
}

public final void addListener(Runnable runnable) {
...
}
}

class Concrete extends Abstract {
Concrete() {
// Should not call signalEvent() here.
}

void somethingHappened() {
// May call signalEvent() here.
}
}

现在可以从子类构造函数中调用 signalEvent(),但是不可能在那个时候已经添加了监听器并且事件会丢失。在我们的代码库中,偶尔有人会添加这样的调用,我希望能够尽早捕获此类调用(使用 assert 语句或类似语句)。

是否可以检查实例方法是否正在从当前实例的子类构造函数或初始化程序中直接或间接调用,或者是否可以检查实例的所有构造函数是否已完成?

最佳答案

简而言之,没有优雅的 Java 机制允许您这样做,但您可以考虑使用工厂模式。您可以创建一个工厂类,而不是直接使用 new 关键字创建实例,它负责创建实际实例并调用一个额外的“创建后”方法,让实例知道它已经完成创建。

如果你使用像 spring 这样的依赖注入(inject),你可以开箱即用,但如果没有,解决方案可能看起来像这样:

interface PostConstruct { // the classes need to implement that
void postConstruct();
}

public class InstanceFactory {
public <T extends PostConstruct> T create(Class<T> clazz, Object... params) {
T instance = //create using reflection
instance.postConstruct();
return instance;
}
}

关于java - 检查实例方法是从构造函数调用的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31248548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com