长期运行的构造函数是否会创建半初始化对象?

我有一个类“A”,它读取XML文件并进行一些处理。 我在构造函数中添加了一个方法“load”,但我想知道如果XML文件大小很大并且需要时间加载会发生什么。

class A { public String fileName; A(String fileName) { this.fileName = fileName; load(); } private load() { //here i load some xml file by given file name; } public searchByTag(String sometag) { //some search } public extractData() { //extract some data } } 

例如,如果我们有以下情况:

 A a = new A("somefile"); a.searchByTag("tag"); a.extractData(); 

对象“a”是在加载文件后创建的,对吧?

是的,执行该段代码的线程将在返回A实例之前通过所有负载。

从技术上讲,对象“a”是在加载之前创建的(内部加载可以安全地引用它),但只有在构造函数返回时才将其赋值给变量“a”,这意味着它在完成执行时也会加载( ) 方法。

由于从构造函数调用load() ,实例构造将花费解析XML文件所需的时间。 构造函数仅在完成时存在,即对象已准备就绪。 在您的情况下,仅在解析XML时。

除非发生错误,否则程序的控制流不会返回构造函数调用,除非发生错误,在这种情况下会抛出exception。

如果没有发生错误,则在加载文件后将创建对象,如您所述。

一旦调用了构造函数,就会创建该对象,但除非返回了load方法,否则不会将其返回给您。

但问题是基本设计不对。 您不应该从构造函数中调用load方法。

让构造函数只调用该对象,然后在其上调用load方法来读取xml文件。 您需要在类中具有过载的读取方法,如下所示:

 private load() { //here i load some xml file by given file name; } //for loading from default location private load(String filePath) { //here i load some xml file by given file name; } private load(File file) { //here i load some xml file by given file name; } 

你明白了! 然后,您的调用程序将具有针对不同情况以不同方式调用load方法的灵活性。

您还应该有两到三种不同的方法来首先获取文件大小,然后使用相应的方法。

  Have a look at this thread http://stackoverflow.com/questions/116574/java-get-file-size-efficiently to get a better idea about an efficient way to deduce file size.