2013-12-11 5 views
4

В методе сеттера Java, который присваивает новый объект в таких областях, как:GC в Java сеттере

public class MyClass 
{ 
    private String s; 
    public void mySetter(String newS) { 
      s = newS; 
    } 
} 

ли называется предыдущей указатель на строке прибудет мусор после mySetter или я должен обнулять s, прежде чем я присвоить его новому значению?

public class MyClass 
{ 
    private String s; 
    public void mySetter(String newS) { 
      s = null; 
      s = newS; 
    } 
} 
+0

Похоже, что мне не нужно его обнулять, но я бы очень хотел, чтобы ссылки, подобные JLS, поддерживали эти утверждения. –

+0

Установка переменной для чего-то и немедленная установка ее в нечто другое бесполезно в большинстве (всех?) Случаях. О, теперь я вижу твою правку. Он необходим там, потому что элемент позиции [- size] будет сидеть там, пока он не будет использоваться, пока кто-то не вставит другой объект в ArrayList. – marcus

+0

Ну, это не обязательно будет немедленно вызвано. Например, если пользователь нажимает кнопку в приложении, он может установить новую строку для MyClass. –

ответ

3

Выполняется ли предыдущая строка с мусором, собранным после вызова mySetter, или я должен отказаться от него, прежде чем присваивать его новому значению?

Если ваши предыдущие String s не упоминаются нигде, то это будет. Но это не произойдет незамедлительно после вызова mySetter. Не нужно устанавливать его на null.

3

сбор мусора будет происходить только тогда, когда объем памяти требуется JVM

так что в вашем случае это не будет мусора, как только ваш метод вызывается.

больше уже ответ here

Кроме того, при назначении строки на другое значение, вам не нужно, чтобы установить его в нулевое значение первого, так как при присвоении нового значения строки означает, что теперь ваша ссылочная переменная не указывает к предыдущему значению объекта String, но к новому и Java предоставляет вам гибкость, не беспокоясь о GC, как и о других языках программирования. Так что не пытайтесь делать GC, Java может позаботиться об этом для вас

3

не нужно отменять, сборщик мусора найдет строку, если никто другой не ссылается на нее.

+0

Не могли бы вы предоставить источник для резервного копирования своего заявления? Благодаря –

+0

его характер сбора мусора. вы можете проверить это, переопределив метод 'finalize()' объекта для записи чего-либо. этот метод вызывается непосредственно перед тем, как объект собирает мусор. – aepurniet

3

Вам не обязательно заниматься s = null;. В Java переменная на самом деле является ссылкой на физический объект в ОЗУ. Поэтому, когда вы делаете s = newS;, вы делаете переменную s, указываете на новый объект в ОЗУ, а старый объект больше не ссылается ни на одну из ваших переменных и будет собираться мусор.

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