在构造函数中执行查询是一个好习惯吗?
class Foo {
public Foo() {
populateData();
}
private void populateData() {
// query database here...
}
}
答案 0 :(得分:7)
构造函数的唯一目的是创建一个类的实例。
查询数据库的问题是操作可能失败。
此时如果你没有正确处理异常,那么你的代码就是bug的候选者。
您应该考虑使用构造函数来准备要使用的对象,这应该很快。
答案 1 :(得分:0)
如果您希望您的代码既清晰易读又可扩展,我建议您考虑Single_responsibility_principle。根据它 - 每个上下文(类,函数,变量等)应该只有一个责任,并且该责任应该完全由上下文封装。它的所有服务都应与该责任保持一致。
所以底线是你的工作方式:
public static class DbAccessor
{
public static void setPopulatedData() {
// query database here...
}
}
答案 2 :(得分:0)
您可以使用延迟值。谷歌番石榴提供了一些实用程序来做到这一点 e.g。
class Foo {
private final Spplier<Data> data = Suppliers.memoize(new Supplier<Data>() {
public Data get() {
// query database here...
return data;
};
});
public Foo() {
}
}