2015-09-10 2 views
-1

ОК, вот что. У меня есть несколько указателей на объект, и я хочу удалить их оба. Я упростил его, ниже, так что не стал спрашивать, почему на земле, я хотел бы попробовать вещь ниже :)Удалить все указатели на объект в java

String first = "ASSIGNED"; 
    String second = test; 
    second = null; 
    System.out.println(first); 

В примере выше, выход по-прежнему приводит к «НАЗНАЧЕН». Тем не менее, я хочу, чтобы меня сначала не назначали. В приведенном выше примере это легко, установив его в null, но в моем реальном примере это невозможно (сначала передается в метод, где я хочу удалить assingment).

EDIT:

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

Видимо, это было немного расплывчато, что я просил, так что давайте попробуем дать лучший пример:

String first = "Assigned"; 
doSomethingAndRemove(first); 

public void Remove(String string) { 
    //Do something 
    //...and remove 
    string = null; 
} 

Дело в том, что первый по-прежнему ссылается на «Назначено» ... Но от чего я читайте в ответах до сих пор, нет никакого способа обойти это?

+1

Я сомневаюсь, что вы пытаетесь сделать это возможно – MadProgrammer

+1

Зачем вы хотите это сделать? –

+0

что второе = тест? и, очевидно, сначала будет печатать «ASSIGNED», поскольку первая ссылка на значение в пуле строк все еще существует – virendrao

ответ

1

Нет, это не возможно, чтобы удалить все «указатели» для данного объекта, для одного, потому что Java не имеет указателей, они называются ссылки.

Ни Java, ни JVM не знают всех ссылок на данный объект. Вот почему сборщик мусора должен отсканировать все, чтобы найти неиспользуемые объекты.

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

Пример:

public static void main(String[] args) { 
    String var1 = "Hello"; 
    doSomething(var1); // The value of var1 is copied to param1 
} 
private static void doSomething(String param1) { 
    param1 = null; // Only clears the param1 reference 
    var1 = null; // Cannot do this, because doSomething() does not have access to var1 
} 

только код в методе main может изменить опорное значение var1.

Update

Если вы хотите метод doSomething, чтобы иметь возможность обновлять var1 другое значение, в том числе. null, то обычной практикой является просто вернуть обновленное значение.

public static void main(String[] args) { 
    String var1 = "Hello"; 
    var1 = doSomething(var1); 
} 
private static void doSomething(String param1) { 
    // do something with param1 
    return "Goodbye"; 
} 

Это, конечно, работает только в том случае, если у вас еще нет другого возвращаемого значения и работает только для одного значения.

Параметры вывода (и ввода/вывода) могут быть смоделированы на Java с использованием шаблона держателя, например. см. Output Parameters in Java

+0

Я думаю, что нашел решение. Я хотел бы поделиться им, но я, похоже, не могу ответить на мой собственный вопрос. Aslo, вы не можете получить код в комментариях – MWB

0
String s=ASSIGNED; 
String s2=s; 
String s2=null; // means just remove the link s2 is pointing to 
System.out.println(s); // print ASSIGNED 

посмотреть фотографию.

enter image description here

, если вы хотите удалить, вы должны назначить null для всех индивидуальных objects.

1

C# может это сделать, используя ref, но Java не может. Следующее - последнее средство на Java, если вы должны это сделать.

public class Nullify 
{ 
    public static void main(String[] args) { 
     String[] first = { "ASSIGNED" }; 
     System.out.println("first[0] = " + first[0]); 

     nullify(first); 
     System.out.println("first[0] = " + first[0]); 
    } 

    private static void nullify(String[] array) { 
     array[0] = null; 
    } 
} 
Смежные вопросы