2009-11-19 4 views
0

질문초급 객체 참조 말,

AnotherObject xRef = new AnotherObject(); 

어떻게 인스턴스의 AnotherObject는 aRef 참조를 사용하여 SomeObject의 메소드에 액세스합니까? SomeObject의 동일한 인스턴스를 사용하려면

답변

6

을 원래 SomeObject으로 인스턴스화하지 않는 이유는 무엇입니까?

// final used to avoid misreferencing variables and enforcing immutability 
private final SomeObject obj; 

public AnotherObject(final SomeObject obj) { 
    this.obj = obj; 
} 

그래서 AnotherObject 이전에 SomeObject 생성에 대한 참조를 가지고 같은

SomeObject obj = new SomeObject(); 
AnotherObject obj2 = new AnotherObject(obj); 

AnotherObject이 보일 것이다. 그런 다음이 참조를 사용하여 메소드를 호출 할 수 있습니다. 원래 개체가 AnotherObject 범위를 벗어나서 필요하지 않은 경우 AnotherObject 안에 만들고 원래대로 캡슐화하십시오. SetSomeObject가

public void SetSomeObject(SomeObject obj) 
{ 
    obj.DoStuff(); 
} 

같은 특성을 가지며 유형 AnotherObject의 멤버 함수

0
xRef.SetSomeObject(aRef); 

.

+1

발신자가 쉽게 할 수있는 일을 누군가에게 요청하는 것은 매우 이상합니다. 특히 "setter"를 의미하는 이름을 가진 메소드에서 (주어진 참조 또는 객체를 비공개 필드 중 하나에 할당 할 때) – Dmitry

+0

true. 나는 대상 객체에 참조를 전달하는 방법을 더 잘 보여주었습니다. 내 이름에 대한 빈약 한 선택. – dkackman

0

전략 디자인 패턴과 데코레이터 디자인 패턴은이 작업을 수행 할 수있는 두 가지 방법입니다.

예를 들어 당신이 할 수 있습니다 :

class AnotherObject 
{ 
    private SomeObject mySomeObject; 
    public AnotherObject(SomeObject mySomeObject) 
    { 
     this.mySomeObject = mySomeObject; 
    } 

    function doSomethingUsingStrategy() 
    { 
     mySomeObject.doItTheMySomeObjectWay(); 
    } 

    function setMySomeObject(SomeObject mySomeObject) 
    { 
     this.mySomeObject = mySomeObject; 
    } 
} 

을 그리고 나중에, 다른 전략을 사용할 수 있습니다

myAnotherObject.setMySomeObject(new ExtendsSomeObject); 
myAnotherObject.doSomethingUsingStrategy() 
1

나는 당신이 요구하는 것은 범위에 대한 질문이라고 생각합니다. 실행 중에 xRef가 aRef를 사용하는 방법을 묻고 있습니까? 대답은 AREF 참조가이

xRef = new AnotherObject(aRef) 

또는 인스턴스 후 가질 수를 인스턴스화 될 때 외부 참조 객체에 전달 될 필요가 있다는 점이다

xRef.setSomeObject(aRef) 
+0

예 범위에 대한 질문입니다. 예를 들어, main 메소드는 클래스의 인스턴스를 생성하고 그 뮤 테이터 메소드를 사용하고, 또한 그 뮤 테이터 메소드를 사용해야하는 또 다른 클래스의 인스턴스를 생성한다. 덕분에 – Kari

-1

AnotherObject는을 가진 멤버 또는 속성이 없습니다 SomeObject의 유형? 그것은 이것을 처리하는 또 다른 방법이 될 것입니다. AnotherObject 클래스의 "SomeObjectMember"회원이 있다면

그래서 : AnotherObject xRef = new AnotherObject(aRef) 또는 사용 setter 메소드 :

xRef.SomeObjectMember = aRef; 
0

당신은 AnotherObject 중 하나를 생성자의 인스턴스 레프에 대한 참조를 제공해야 xRex.setSomeObject(aRef) .내부적으로 사용할 수 레프를 저장하기 위해 인스턴스 변수를 가질 필요가 AnotherObject이 경우 같은 : 또한 xRef.doSomethingWithSomeObject(aRef)처럼 그들을 필요로 AnotherObject에 방법에 SomeObject의 인스턴스를 전달할 수

class AnotherObject { 
    SomeObject aRef; 
    public AnotherObject(SomeObject aRef) { 
     this.aRef = aRef; 
    } 
    public void doSomethingWithSomeObject() { 
     aRef.doSomething(); 
    } 
} 

.

class AnotherObject { 
    public void doSomethingWithSomeObject(SomeObject aRef) { 
     aRef.doSomething(); 
    } 
} 
0

(다른 사람들이 지적한 것처럼) 여러 가지 방법이 있습니다. 그래도 객체 구조에 대해 생각하고 싶다면 ...

아마도 주요 메소드는 aRef를 인스턴스화하지 않아야합니다. 아마도 xRef의 생성자에서 인스턴스화되어야합니다 (xRef가 " "아 레프.

의 기능의 레프는 외부 참조 방법을 사용할 때마다 그것을 통과 할 수 있습니다, 당신은 전혀를 저장할 수 없습니다 어떤 점에서 여러 인스턴스를 할 수 있습니다.

이를 비즈니스 논리 수준에서 개체 모델을 고려해야 할 곳입니다. 개체 간의 관계는 무엇입니까?

(제 추측에 따르면 xRef가 aRef를 인스턴스화하고 참조 자체를 유지하기를 원한다면 "주"가 aRef와 실제로 대화해야 할 경우 xRef에게 xRef에 메시지를 전달하거나 xRef에 aRef의 인스턴스를 요청할 수 있습니다.)

+0

. 논리는 이것입니다 : main 메소드는 클래스의 인스턴스를 생성하고 그것의 뮤 테이터 메소드를 사용하여 데이터를 설정 한 다음, 어떤 시점에서 그 뮤 테이터 메소드를 사용해야하는 또 다른 클래스의 인스턴스를 생성합니다. – Kari

+0

두 객체는 ​​무엇을 나타내는가? ? 개들? 나무? 데이터베이스? 계산을위한 피연산자? 서로 다른 두 대상 사이의 관계는 무엇입니까? 다른 사람이 첫 번째 사실을 알지 못해도 상대방을 사용하기 때문에 그들은 동급생이 아닙니다. 왜 당신은 main에 두 객체를 모두 생성해야합니까? 다른 곳에 사용할 수없는 메인에 몇 가지 정보가 있습니까? –

+0

이상하게 보입니다. 그러나 이러한 질문에 대답하고 이와 같은 관계를 생각하면 OO 모델이 성장하고 변형 될 때 사용할 수있게 만드는 것입니다. 그렇지 않으면 객체가 쓸모가 없습니다. –

0

ref를 전달한 다음이를 수행해야합니다. 메인 방법

public static void main(String [] args) { 
    SomeObject xRef = new SomeObject(); 
    AnotherObject aRef = new AnotherObject(); 
    // pass the ref... 
    aRef.setSomeObject(xRef); 
    // use it 
    aRef.doSomethingWithSomeObject(); 
} 

에서 다음과 같이 사용할 수 있습니다

class AnotherObject { 
    SomeObject someObject; 

    public void setSomeObject(SomeObject some) { 
     this.someObject = some; 
    } 

    public void doSomethingWithSomeObject() { 
     this.someObject.someMethod(); 
    } 

    ..... rest of your code 
} 

그 방법은 당신이 무엇을 필요가 있습니까?

+0

예. 기본적으로 객체 참조의 범위는 항상 객체 참조를 만드는 클래스로 제한됩니다. – Kari

+0

Mmhh라고 말할 수 있습니다. 다른 컨텍스트에서 사용하려면 예제와 같이 참조를 전달할 수 있습니다. 또한 클래스에 표시 할 수있는 * class * 속성을 가질 수 있습니다. 그러나 그것은 또 다른 주제입니다. 그것들을 "글로벌"변수라고 생각할 수 있습니다. 한 가지 예가 System 클래스의 "out"속성입니다 (예 :'System.out.println')? – OscarRyz

1

그의 질문에 대한 대답은 첫 번째 클래스를 정적 ​​클래스로 만드는 것입니다.

+0

내가 한 것은 정적 인 것으로서 첫 번째 클래스의 필드를 설정하고 접근 자 및 변경자 메서드를 public으로 설정했습니다. 그런 식으로 동일한 클래스의 두 인스턴스를 만들 수 있지만 데이터는 동일합니다. 그러나 나는 그것을하는 더 좋은 방법이있을 것이라고 생각했습니다! – Kari