После того, как ваш код вызовет B ref = (new A()).getB()
, куча Java будет содержать переменную ref
, которая указывает на тот же анонимный объект, что и (new A()).b
, который, в свою очередь, имеет внутреннюю ссылку на вложенную new A()
. Других ссылок на объект new A()
не существует.
Ваш вопрос: как мы можем форсировать сборку мусора объекта A при сохранении анонимного объекта b живым? Ответ: вы не можете, потому что если бы вы могли, что бы случилось с кодом в b, который использует внутреннюю ссылку на A?
Если вы знаете, что код вашего класса B не ссылается на включающий его класс, вы можете объявить его статическим, то есть он не получит внутреннюю ссылку на свой класс включения. Для этого вам нужно сделать его вложенным классом, поскольку вы не можете сделать анонимные классы статичными:
public class A {
static class Bimpl implements B { public void method() { do something } };
private B b = new Bimpl();
public B getB() { return b; }
}
public interface B { void method(); }
Если ваш код вызывает B ref = (new A()).getB()
, то в этом случае объект new A()
будет доступен для сборки мусора, поскольку ссылки на него не существует.