Производительность Java: при очистке объекта лучше установить значение NULL или создать новый объект. - PullRequest
5 голосов
/ 28 июля 2011

При повторном использовании объекта, лучше ли очистить данные, установив для него значение null, или создать новый объект?

   Object a = new Object();
   for(...){
       ...
       a = null;
       **OR**
       a = new Object();
    }

Вот пример, на который я ссылаюсь:

Customer a = new Customer();
Collection<Customer> data = new ArrayList<Customer>();

        while (rs != null && rs.next()) {   
            a = new Customer();
            a.setCustId(rs.getLong("CUST_ID"));
            a.setPerNo(period);
            a.setName(rs.getString("cust_nm"));

            if(a!= null)
                data.add(a);
        }

Мне интересно, будет ли

a = new Customer();

- это лучший способ сделать это, или если это нужно сделать по-другому, чтобы сэкономить память и обеспечить оптимальную производительность, потому что в каждом цикле есть новая информация о клиенте, которую нужно вставить. Насколько я понимаю, если вы создаете нового клиента, вы создание нового объекта и указание на этот новый объект. Таким образом, старый объект, на который указывал, будет собираться сборщиком мусора - то же самое в случае установки его на ноль. Это правильное понимание?

Ответы [ 4 ]

14 голосов
/ 28 июля 2011

Я бы предпочел:

for (...) {
    Object a = new Object();
    ...
}

Зачем делать область больше, чем нужно?

Аналогично, если бы я не нуждался в новом объекте, я бы не создал его ради него.

Трудно сказать намного больше только из приведенного описания - если вы можете привести более полный и реальный пример, мы могли бы дать более конкретные рекомендации.

(Обратите внимание, что нет никаких признаков того, что вы хотите использовать объект несколько раз, столько же, сколько несколько раз используйте переменную . Это очень разные понятия.)

РЕДАКТИРОВАТЬ: глядя на ваш конкретный пример, я бы написал это так:

Collection<Customer> data = new ArrayList<Customer>();

while (rs != null && rs.next()) {   
    Customer a = new Customer();
    a.setCustId(rs.getLong("CUST_ID"));
    a.setPerNo(period);
    a.setName(rs.getString("cust_nm"));

    data.add(a);
}

Обратите внимание, что это не создает любых Customer объектов, которые могут быть использованы для сборки мусора - тогда как ваш исходный код создает экземпляр Customer перед входом в цикл, а затем игнорирует вновь созданный объект, вместо этого создайте новый и переназначьте значение a.

6 голосов
/ 28 июля 2011

Создание объектов там, где они вам нужны. Не там, где ты не. И не беспокойтесь об этом уровне оптимизации, пока профилировщик не скажет вам.

Редактировать: Учитывая ваш обновленный ответ, читателям будет понятнее объявить переменную и создать экземпляры ваших объектов Customer внутри цикла, как рекомендовал Джон. Что касается вопросов производительности и сбора мусора, вам необходимо улучшить понимание основных языковых концепций .

1 голос
/ 28 июля 2011

Я думаю, что ваше замешательство происходит из-за непонимания того, что объекты передаются по ссылке.Если вы пришли из C-фона, поймите, что в Java Customer a = new Customer(); на самом деле делает что-то вроде

Customer* a = (Customer*) malloc (sizeof(Customer));
initializeCustomer (a); //the constructor initializes the state of the object.

Поскольку вам действительно нужна новая память для каждого клиента, которого вы добавляете в свой список, вы не можете избежать созданияновый объект Customer для каждой итерации цикла.

1 голос
/ 28 июля 2011

Явно NULLing ссылки требуются для особых случаев, когда вы явно хотите «прекратить» ссылаться на объект, и в противном случае это приведет к фактической утечке памяти. В качестве примера вы можете взглянуть на реализацию List на основе массива, в которой пустые слоты массива NULL не указывают на ссылки / объекты, которые больше не используются.

...