Feu*_*mel 5 java debugging assertions
我想从非final类的实例方法中检查该类的构造函数和初始值设定项及其特定实例的子类链是否已经完成.
在下面的示例中,我有一个类Abstract
,可用于实现允许添加侦听器的接口(为简单起见,这只是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.
}
}
Run Code Online (Sandbox Code Playgroud)
现在可以signalEvent()
从子类构造函数中调用,但是那时候没有办法添加一个监听器,事件就会丢失.在我们的代码库中,偶尔会有人添加这样的调用,我希望能够尽早捕获这些调用(使用assert
语句或类似的语句).
是否可以直接或间接地从当前实例的子类构造函数或初始化程序中检查实例方法,或者,是否可以检查实例的所有构造函数是否都已完成?
简而言之,没有优雅的 Java 机制允许您这样做,但您可以考虑使用工厂模式。您可以创建new
一个工厂类,负责创建实际实例并调用附加的“创建后”方法,让实例知道它已完全创建,而不是直接使用关键字创建实例。
如果您使用像 spring 这样的依赖注入,那么您可以开箱即用,但如果没有,解决方案可能如下所示:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
684 次 |
最近记录: |