我记得几年前我使用静态初始化器来调用类级别的设置操作。我记得它有非常奇怪的行为,所以我决定远离它们。也许是因为我搞错了从上到下的顺序或者我还是个新手。但是现在我需要重新审视它们,并且我想确保没有更好的方法可以同样简洁。
我知道这不是时髦的做法,但是我经常有数据驱动的类,它们维护一个从数据库中导入的实例静态列表。
public class StratBand {
private static volatile ImmutableList<StratBand> stratBands = importFromDb();
private final int minRange;
private final int maxRange;
private static ImmutableList<StratBand> importFromDb() {
//construct list from database here
}
//constructors, methods, etc
}
当我有数十个类似于这个的表驱动类时,这种模式非常简洁(是的,我知道它将类与一种数据/实例源紧密耦合)。
然而,当我发现Google Guava的好处时,我想使用EventBus在发布某个事件时更新静态列表。我会创建一个静态final布尔变量只是为了调用初始化注册的静态方法。
public class StratBand {
private static volatile ImmutableList<StratBand> stratBands = importFromDb();
private static final boolean subscribed = subscribe();
private final int minRange;
private final int maxRange;
private static ImmutableList<StratBand> importFromDb() {
//construct list from database here
}
//constructors, methods, etc
private static boolean subscribe() {
MyEventBus.get().register(new Object() {
@Subscribe
public void refresh(ParameterRefreshEvent e) {
stratBands = importFromDb();
}
});
return true;
}
}
这很快就变得很烦人了,因为编译器会对已订阅的变量从未被使用发出警告。而且,它只会增加混乱。所以我想知道是否可以使用静态初始化程序,如果我不将其解耦成两个或更多个类,那么真的没有更好的方法吗?您有什么想法吗?
public class StratBand {
private static volatile ImmutableList<StratBand> stratBands = importFromDb();
static {
MyEventBus.get().register(new Object() {
@Subscribe
public void refresh(ParameterRefreshEvent e) {
stratBands = importFromDb();
}
});
}
private final int minRange;
private final int maxRange;
private static ImmutableList<StratBand> importFromDb() {
//construct list from database here
}
//constructors, methods, etc
}