Java构造函数,在哪里进行一次重度初始化?

时间:2017-02-01 09:57:28

标签: java constructor

我应该在构造函数中放置重度初始化吗?一个访问外部资源并抛出所有异常的人? 逻辑上,初始化发生一次,应该在类的开头执行,但是不建议在构造函数中放置大量逻辑,有人说它应该只进行简单的赋值。 你认为最好的是什么?

3 个答案:

答案 0 :(得分:2)

最佳答案可能取决于“重”的含义。

如果它意味着“冗长的计算”,您可以考虑在后台线程中执行它们并公开服务以在需要时使它们可用。

如果它意味着“要初始化很多东西”,这可能表明你的对象有太多的状态,需要重构。

该类的每个实例都需要自己的数据副本吗?或者它可以是静态的,并为所有类初始化一次?如果是后者,也许你可以在静态块中完成。

是只读状态还是可写?这对于线程安全很重要。您是否正确同步访问?

答案 1 :(得分:1)

构造函数应该只构造要使用的对象。如果有问题的对象需要连接等,则应该有调用者可以调用的公共面向方法,并且这些方法可以抛出调用者可以依次处理的异常。

即。

连接到数据库 您创建一个连接 设置其键/值/参数 然后调用connect。

使用这样的模式的原因是你可能需要提前构建一个对象而不需要进行各种繁重的工作等。

如果您查看99%的Java内置库,他们会使用此模式,其中构造函数返回给定对象的新实例。

然后您决定使用该对象取决于您。

如果您的对象需要设置信息,则应将这些信息传递给构造函数。

例如,您可以将文件位置/路径传入构造函数,然后对象将该位置存储在封装变量中。例如。

但是当要读取文件时,应该调用一个名为load或类似的方法。该方法将检查文件是否存在并读取内容。

这允许load方法抛出异常并可能具有重试等,如果需要,这些异常可以在单独的线程上运行。在构造函数中执行此类操作是不可取的。

答案 2 :(得分:1)

您可以创建一个静态工厂类,它可以在繁重的资源中输入一次,并通过静态方法提供对它的访问。