Java 在构造函数中填充大量数据是一种不好的做法吗?

Java 在构造函数中填充大量数据是一种不好的做法吗?,java,concurrency,constructor,hashmap,Java,Concurrency,Constructor,Hashmap,在构造函数中导入所有数据是一种不好的做法吗?或者静态工厂方法更适合创建对象,填充对象,然后返回对象 我确实希望用所有数据初始化一些对象,比如数据驱动的单例,比如扩展的Hashmaps,它在构建时从数据库中摄取数据。我认为这种方法比惰性初始化更好,尤其是在并发环境中。但我做错什么了吗 class MyHashMap extends HashMap<MyKey, MyObject> { private MyHashMap() { populateFromDb

在构造函数中导入所有数据是一种不好的做法吗?或者静态工厂方法更适合创建对象,填充对象,然后返回对象

我确实希望用所有数据初始化一些对象,比如数据驱动的单例,比如扩展的Hashmaps,它在构建时从数据库中摄取数据。我认为这种方法比惰性初始化更好,尤其是在并发环境中。但我做错什么了吗

class MyHashMap extends HashMap<MyKey, MyObject> 
{
    private MyHashMap() { 
         populateFromDb();
    }
}
类MyHashMap扩展了HashMap { 私有MyHashMap(){ populateFromDb(); } }
如果一切都属于所创建对象的状态,那么这没有什么“错误”

然而,从架构的角度来看,您应该有一些地方可以运行所有业务代码。这就是您发出数据库连接并读取数据的地方。您甚至可以编写一个单独的类来执行填充任务

原因:


也许有一天你会想用别的东西来取代人口机制。例如,在单元测试中,您可能希望用一些硬编码的测试数据填充数据,因此您不需要为单元测试创建数据库。

理论上,拥有一个庞大的构造函数是没有错的。但也许像工厂这样的创意设计模式会有所帮助。Joshua Bloch在他的书《有效Java》中建议工厂优先于构造函数,构建器优先于大型参数化构造函数。生成器模式允许您分步创建对象。您是否需要同时使用所有数据?

在构建之前是否公开
指针(可能指向多个线程)?这将是我尽量不做的事情,因为部分构建的对象永远不会逃逸。让我们假设所有构造函数操作,如populateFromDb()都不允许任何“this”引用转义。您可以开始在构造函数中预取数据。“预取”是什么意思?@Thomas N.:开始从数据库加载数据(在单独的线程中)并返回“this”。当需要数据时,等待线程完成。我同意。工厂是一个很好的模式,检查一下生成器模式。好的,我想我更喜欢静态工厂方法。