【问题标题】:Will long-running constructors create half-initialized objects?长时间运行的构造函数会创建半初始化的对象吗?
【发布时间】:2011-08-25 09:15:45
【问题描述】:

我有一个“A”类,它读取一个 XML 文件并进行一些处理。我在构造函数中放了一个“加载”方法,但我想知道如果 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”是在文件加载后创建的,对吧?

【问题讨论】:

  • 我假设加载将阻止进一步代码的执行,直到它完成。
  • @adfgs:我编辑了您的问题标题 - 请检查我是否理解您的问题的目标,如果没有,请再次编辑。

标签: java constructor initialization


【解决方案1】:

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

从技术上讲,对象“a”是在加载之前创建的(在加载内部你可以放心地参考this),但它只有在构造函数返回时才被分配给变量“a”,这意味着它也完成了执行load() 方法。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        一旦你调用了构造函数,对象就会被创建,但除非加载方法返回,否则它不会返回给你。

        但问题是基本设计不正确。您不应该从构造函数中调用 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.
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-05
          • 1970-01-01
          • 2023-03-31
          • 2013-10-30
          • 1970-01-01
          • 1970-01-01
          • 2012-08-14
          相关资源
          最近更新 更多