Будут ли продолжительные конструкторы создавать полуинициализированные объекты? - PullRequest
2 голосов
/ 25 августа 2011

У меня есть класс «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();

Объект "а" создается сразу после загрузки файла, верно?

Ответы [ 4 ]

10 голосов
/ 25 августа 2011

Да, поток, выполняющий этот кусок кода, пройдет всю нагрузку перед возвратом экземпляра A.

Технически, объект «a» создается перед загрузкой (внутри загрузки вы можете смело ссылаться на это), но он присваивается переменной «a» только при возврате конструктора, что означает, что он также завершил выполнение метод load ().

3 голосов
/ 25 августа 2011

Поскольку из конструктора вызывается load(), создание экземпляра займет столько времени, сколько необходимо для анализа XML-файла. Конструктор завершается только тогда, когда это сделано, то есть объект готов. В вашем случае только когда XML был разобран.

1 голос
/ 25 августа 2011

Поток управления программой не возвращается к вызову constructur, пока не будет выполнен весь код, за исключением случаев возникновения ошибок, в этом случае будет выдано исключение.

Если ошибок не произошло,объект будет создан после загрузки файла, как вы утверждаете.

0 голосов
/ 25 августа 2011

Объект будет создан, как только вы вызовете конструктор, но он не будет вам возвращен, пока не будет возвращен метод 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;
}

Вы поняли идею !! И тогда ваша вызывающая программа будет иметь возможность по-разному вызывать метод загрузки для разных ситуаций.

У вас также должно быть два-три разных метода, чтобы сначала получить размер файла, а затем отсортировать соответствующий метод.

  Have a look at this thread /119540/java-poluchit-razmer-faila-effektivno  to get a better idea about an efficient way to deduce file size.
...