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

时间:2011-08-25 09:15:45

标签: java constructor initialization

我有一个类“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”是在加载文件后创建的,对吧?

4 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

程序的控制流程在所有代码都被执行之前不会返回到constructur调用,除非发生错误,在这种情况下会抛出异常。

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

答案 3 :(得分:-1)

只要您调用了构造函数,就会创建该对象,但除非返回了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.