2015-06-03 2 views
2

Мне просто интересно, следует ли нам делать obj = null после добавления его в массив. Обратите внимание, что речь идет о специальном случае, читаемом ниже.Должен ли я делать obj = null после arraylist.add (obj)

Во-первых, давайте рассмотрим класс A так:

public class A { 
    public void doSomething(B object) { 
     // some code here 
    } 
} 

и класс B так:

public class B { 
    private final A a; 
    public B(A a) { 
     this.a = a; 
    } 
    public void aMethod() { 
     // Does something here 
     a.doSomething(this); 
    } 
} 

До сих пор все в порядке. Объект типа B может вызвать метод AdoSomething() для редактирования объекта на основе некоторых данных.

Теперь рассмотрим следующую ситуацию: doSomething() добавляет объект B к архаисту. Теперь, который, если эти коды следует использовать:

public void doSomething(B b) { 
    arrayList.add(b); 
    b = null; 
} 
// or 
public void doSomething(B b) { 
    arrayList.add(b); 
} 

В первом doSomething() мы устанавливаем объект в нуль, что означает, что метод вызывающий становится нулевым. Ну, это нормально, так как doSomething() звонок - последнее заявление, которое мне нужно в моем aMethod(). Но хорошо ли это сделать?

+5

Нет, вызывающий метод не становится нулевым. Java передается по значению. – markspace

+1

, вы должны прочитать о [Закон Деметры] (http://en.wikipedia.org/wiki/Law_of_Demeter). –

+2

Я в замешательстве, что вы пытаетесь выполнить, установив 'b = null;'? Нет никакого случая, когда это имеет смысл сделать это, но если вы объясните, почему вы думаете, что это хорошая идея или что вы думаете, что это так, то я или другой может помочь вам узнать, почему это в основном ничего не делает в великой схеме вещей. –

ответ

8

Просто используйте:

public void doSomething(B b) { 
    arrayList.add(b); 
} 

Там нет абсолютно никакой необходимости, чтобы установить параметр в нуль, как это (параметр, а не объект, это относится к) больше не существует при выходе из метода.

Re

Обратите внимание, что речь идет о частном случае, читайте ниже.

Я не вижу ничего особенного в вашем случае.

В первом doSomething() мы устанавливаем объект равным null, что означает, что вызывающий объект становится нулевым. Ну, это нормально для меня, поскольку вызов doSomething() - это последнее утверждение, которое мне нужно для моего метода aMethod(). Но хорошо ли это сделать?

Объекты не могут быть установлены в null, могут использоваться только переменные и параметры (которые являются переменными). Вы смешиваете ссылки со ссылочными переменными, основное отличие в Java.

+0

Объекты не могут быть установлены в 'null'. Этот единственный оператор суммирует все, что есть в семантике 'pass-by-value' в Java. +1 – CKing

+0

Спасибо и вам, и @makato. На самом деле я не был уверен в этом, потому что это не слишком «сквозная ценность». Это ссылка, пока вы не установите ее значение, потому что если вы выполняете 'object.something()', она фактически изменяет исходный 'объект'. – Chaoz

+0

Не совсем. Вы изменяете атрибут исходного объекта, но это не то же самое, что * * исходный объект. – Makoto

5

Нет; он слишком сильно связан с ответственностью doSomething. Почему он должен заботиться о том, что жизненный цикл того, что он вставил?

Это также не будет иметь никакого эффекта. Из-за того, что Java является передачей по значению, вы изменяете только облачное значение b, а не где-то b.

Код, подобный этому, только смущает кого-то, читающего его по дороге (и, возможно, самого себя), поскольку поведение, которое вы изображаете, вводит в заблуждение. Если вы обеспокоены жизненным циклом объекта, который вы вставляете, обратите внимание, что пока есть ссылка, он не будет иметь права на сбор мусора. Это означает, что пока коллекция, которую вы добавляете, не подходит, эта ссылка также не подходит.

Смежные вопросы