2016-03-10 3 views
0

Скажем, у меня есть код:Java Время жизни объекта приведены ссылки из аргумента

class Foobar { 
     Object item = null; 
     ItemInstantiator inst = new ItemInstantiator(); 
     public instantiateItem() { 
      inst.instantiate(item); 
     } 
    } 

    class ItemInstantiator { 
     public instantiate(Object item) { 
      item = new Object(); 
     } 
    } 

Поскольку класс Foobar имеет прямую ссылку на новый объект, созданный в Instantiate(), что новый объект не должен быть мусора после экземпляра() заканчивается, не так ли?

Я спрашиваю, потому что я работаю над проектом, где имеет смысл объявить объект в одном классе и создать экземпляр объекта в методе другого класса. Проблема заключается в том, что после завершения создания объекта объект все еще равен нулю.

+1

Java является передачей по значению, поэтому вы не можете изменить значение аргумента 'item', как вы пытаетесь сделать. Если 'item' содержит ненулевую ссылку на какой-либо объект, вы можете изменить этот объект, если он был изменен, но вы не можете повлиять на значение' item' в 'Foobar' из' ItemInstantiator # instantiate() '. Если это неясно, прочитайте http://stackoverflow.com/q/40480/18157. Это не имеет ничего общего с временем жизни объекта. Вы создали новый объект и сразу же отбросили его. –

ответ

2

Вы экземпляра объекта в методе и НЕ возвращающегося свою ссылку

Вы должны изменить к

class Foobar { 
     Object item = null; 
     ItemInstantiator inst = new ItemInstantiator(); 
     public instantiateItem() { 
      item = inst.instantiate(item); 
     } 
    } 

    class ItemInstantiator { 
     public Object instantiate(Object item) { 
      item = new Object(); 
      return item; 
     } 
    } 

The Book Чистый код - Справочник по Agile Software Craftmanship утверждает, что в общих выводах следует избегать. Если ваша функция должна изменить состояние чего-то, измените его состояние.

Пожалуйста, переосмыслите дизайн класса, действительно ли имеет смысл создать объект, передав ссылку. В соответствии с вашим кодом это не имеет никакого смысла. Вы можете просто создать объект без каких-либо аргументов. item

+0

Благодарим вас за хорошо сформированный отклик. Причина, по которой я делаю это, заключается в том, чтобы рекурсивно создать структуру типа связанного списка, создав экземпляр элемента списка, присвоив ему указатель предыдущего элемента, а затем передав указатель нового элемента, чтобы он мог быть назначен для следующей рекурсии. Также я использовал операторы return для кодов ошибок. –

+0

ОК, вы должны сделать это в одном классе. Это будет более конкретным в функции. Кроме того, попробуйте использовать обработку исключений вместо кодов ошибок. Это сделает ваш код более сложным. Это только мое мнение. – Keerthivasan

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

  • Нет связанных вопросов^_^