2015-10-22 6 views
0

Я привык работать с языками, которые явно позволяют работать со ссылками/указателями, что я пытаюсь сделать, полагается на это.Работа со ссылками на Java для создания побочных эффектов

Если у меня есть объект класса Foo, и у меня есть три объекта класса Bar. Как все три объекта класса Bar ссылаются на один экземпляр Foo?

(Я полагаюсь на побочные эффекты)

Если это возможно в Java вообще (который я считаю, дает вам копию справки, но я читал противоречивую информацию, и теперь остается немного запутался)

+3

'bar1.field = foo; bar2.field = foo; bar3.field = foo; ' –

+1

Передайте' Foo foo' как аргумент метода в 'Bar' для получения переменной' Foo'. Затем у вас будет копия ссылки, хранящейся в 'Bar', и любой экземпляр' Bar' может изменить состояние этого 'Foo' (если возможно). Если вы спрашиваете, может ли какой-либо экземпляр «Bar» заменить ссылку на объект в «Foo» для других экземпляров «Bar», это невозможно, поскольку Java проходит по значению. –

+1

Если вы можете предоставить немного более подробную информацию о вашем случае использования, это может быть очевидно на то, что вам нужно. Является ли Foo синглтон? Является ли Bar состоящим из экземпляра Foo? Немного больше помощи в том, что вы ищете, может помочь дать лучший ответ. –

ответ

2

Если это возможно в Java вообще (который я считаю, дает вам копию из ссылки, но я читал противоречивую информацию, и теперь оставаться немного запутанный)

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

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

Если класс определен следующим образом:

public class Bar { 
    private Foo fooRef; 

    public Bar(Foo foo) { 
     this.fooRef = foo; 
    } 

    : 
    : 
} 

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

Ниже будет инстанцирует три экземпляра Bar, каждый со ссылкой на тот же Foo объект:

Foo myFoo = new Foo(); 

Bar bar1 = new Bar(myFoo); 
Bar bar2 = new Bar(myFoo); 
Bar bar3 = new Bar(myFoo); 

Поскольку поле экземпляра, fooRef является изменяемым, объект, который содержит это может быть мутировано любым который имеет доступ к полю. Это позволяет использовать побочные эффекты (хотя изменяемые поля представляют особую озабоченность при параллельном программировании).

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