2013-05-15 3 views
3

У меня есть сомнения относительно ссылок на объекты в Java. Он всегда отправляет свой объект по ссылке на функции, а это означает, что если вы измените их в функции, отправленной, они вернутся к изменениям.Ссылки объектов в Java

Решение для этого будет копировать объект перед отправкой. Но для этого мне нужно создать функцию копирования в классе объектов? Или любая другая альтернатива? Спасибо

+7

_It всегда посылает свой объект со ссылкой на функции_ Нет, он отправляет копию значения ссылки. –

+0

Для этого нет простого решения. Посмотрите на объяснение неизменяемых объектов в java: http://www.javapractices.com/topic/TopicAction.do?Id=29 Если вы хотите, чтобы ваши объекты были неизменными, вам нужно запрограммировать поведение самостоятельно. – NeplatnyUdaj

+0

Существует причина, по которой объекты передаются по ссылке, ваш код не должен пытаться изменить это поведение, но использовать его в своих интересах. У вас есть пример кода, который должен отправить копию объекта? – BLuFeNiX

ответ

3

Я обычно добавить конструктор копирования для такого рода сценарий, как так:

public class MyObject { 
    //members 


    public MyObject(MyObject objectToCopy) { 
     this.member = objectToCopy.member; 
     //... 
    } 
} 

Тогда вы можете просто создать новый объект с помощью простого одного вкладыша.

public void DoWork(MyObject object) { 
    MyObject copy = new MyObject(object); 
    //do stuff 
} 
+1

Не лучше ли применять клон? – danieln

+1

-1: Извините, но это неправильный способ скопировать/клонировать объект. Дополнительная информация: [Java: рекомендуемое решение для глубокого клонирования/копирования экземпляра] (http://stackoverflow.com/q/2156120/1065197) –

+0

Это приводит к очень грязному коду для более сложных объектов. Я не буду предлагать копировать вот так. – Vegard

1

Вы должны создать конструктор копирования для каждого объекта самостоятельно. Причина проста: если A ссылается на B и вы хотите скопировать A, скопируете ли вы ссылку на B или весь ссылочный объект B? Этот вопрос должен отвечать на каждый случай индивидуально, поэтому нет общего решения.

1

Это правда, что вы отправляете объект, и изменения будут внесены в указанный объект. Там не просто «родной» способ копирования объектов в Java, но вы можете копировать объекты, используя такие структуры, как бульдозер:

http://dozer.sourceforge.net/

3

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

Здесь есть ключевое различие. Вы не передаете объект в качестве ссылки, поэтому ссылка ссылка сломана as soon as you assign a new instance to your parameter. Пока значение ссылки остается неизменным, изменение содержимого передаваемого объекта будет сохраняться, когда вы вернетесь к вызывающему. Другим ключевым отличием является то, что эталонное значение может быть null ... но null не является объектом - так как вы можете ссылаться на отсутствие объекта?

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

Для простых объектов (объектов с иерархией неглубокого класса, как на пример ниже), как правило, можно получить, с основным конструктором копирования:

class Album { 
    private String title; 
    private String artist; 

    public Album(Album copy) { 
    this.title = copy.title; 
    this.artist = copy.artist; 
    } 
} 

Это позволит вам копировать объект внутри вашего метода :

public void copyAlbum(Album album) { 
    album = new Album(album); // Clone the album passed in 
} 

для более сложных графов объектов, вы можете использовать библиотеку, такую ​​как Orika или Dozer точно создать глубокую копию объекта. This question содержит полезные советы по копированию объектов в Java.

+0

+1 для первого предложения. – Gamb

+1

Ваш ответ был хорошим ** до ** вы написали этот пример для клонирования объектов ... –

+0

Пожалуйста, определите * простые * классы (а не объекты, так как объект является экземпляром класса). –

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