2013-03-15 1 views
30

int someVariable; 문을 사용하여 정의 된 변수가 있다고 가정 해 보겠습니다. 코드가 실행되는 동안 변수의 값이 변경됩니다.변수에 대한 변경 리스너를 만드는 방법은 무엇입니까?

어떻게이 변수의 변경 사항을 추적 할 수 있습니까? 어떻게하면 onSomeVariableChangedListener처럼 작동하는 Listener를 구현할 수 있습니까?

또 다른 클래스의 Listener를 설정할 수 있도록 한 페이지의 다른 메소드가 실행 된시기를 알아야합니다.

+0

디버깅의 목적을 위해이 일을 할 의향이 있습니까 또는 프로덕션 코드에서 이것을 사용 하시겠습니까? –

+0

생산 코드 – Sinigami

답변

26

세터/게터쌍 뒤에 변수를 숨길 수있는 많은 이유 중 하나입니다 관련이 있습니다. 그런 다음 세터에서이 변수가 적절한 방식으로 수정되었음을 청취자에게 알릴 수 있습니다. 다른 사람들이 언급했듯이, 원하는 것을 정확히 수행 할 수있는 방법은 없습니다. 직접 구현해야합니다.

또는 Benjamin은 데코레이터 패턴이라는 재미있는 패턴을 제공합니다.이 패턴은 문제의 코드를 수정할 수없는 경우 유용 할 수 있습니다. You can look up more info at wikipedia

아이디어는 개체 주위에 호환되는 래퍼를 작성하는 것입니다. 문제의 개체가 MyClass 유형이라고 가정 해 보겠습니다.

class MyClass{ 
    publc void doFunc(){...} 
} 

class MyLoggedClass extends MyClass{ 
    MyClass myObject; 

    publc void doFunc(){ 
     //Log doFunc Call 

     myObject.doFunc(); 

    } 
} 

대신

MyClass object = new MyClass(); 

의 당신은

MyClass object = new MyLoggedClass(new MyClass()); 

지금 코드의 당신의 나머지 각 함수 호출 기록, 또는 통보됩니다 것을 제외하고, 정상에 따라 객체를 사용하는 것이 사용합니다 등등.

위키 백과에서 볼 수 있듯이, 이것은 일반적으로 클래스 질문에서 상속하지만, 귀하의 경우에는 가능하지 않을 수 있습니다.

+1

이 문제에 대한 해결책을 구현하는 방법이 될 수있는 데코레이터 개념을 언급 할 수 있습니다. 기본 예제를 사용하는 것이 더 바람직합니다. –

+0

마지막 줄에'... myLoggedClass ... '대신'MyClass object = new MyLoggedObject ...'를 사용하셨습니까? 그렇다면 업데이트 해 주시겠습니까? 그리고 그것이 맞다면, 설명해 주시겠습니까? 감사. – dbconfession

+0

@dbconfession 좋은 눈, 클래스 이름을 바꾸어 다른 방법으로 고치겠다. –

1

임의의 변수 값이 변경되거나 일부 메소드가 호출되면 알림을 얻는 기본 제공 방법이 없습니다.

3

How to Write a Property Change Listener 그것은 뭔가 당신에게 도움

+0

변수와 변수의 변경 사항을 듣고 싶다고 말할 수있는 한 –

+0

@BenjaminGruenbaum, 내 지식에 따르면 bean이나 클래스의 변수는'property'라고 불리우며, 그렇지 않습니다. '.property' 파일에 관해서. – Patriks

33

Java는 이런 종류의 간단한 관찰자 패턴 구현을 제공하지만, 청취자 통지를 관리하는 방법 내에서 관찰 된 변수를 설정해야합니다. Observable을 확장 할 수 없다면 composition (예 : 클래스의 Observable 인스턴스를 사용하여 알림을 관리)을 사용하거나 java.util.Observable을보고 자신의 롤업 방법에 대한 아이디어를 얻을 수 있습니다 번역.

Flux.java

import java.util.Observable; 

public class Flux extends Observable { 
    private int someVariable = 0; 

    public void setSomeVariable(int someVariable) { 
    synchronized (this) { 
     this.someVariable = someVariable; 
    } 
    setChanged(); 
    notifyObservers(); 
    } 

    public synchronized int getSomeVariable() { 
    return someVariable; 
    } 
} 

Heraclitus.java

import java.util.Observable; 
import java.util.Observer; 

public class Heraclitus implements Observer { 
    public void observe(Observable o) { 
    o.addObserver(this); 
    } 

    @Override 
    public void update(Observable o, Object arg) { 
    int someVariable = ((Flux) o).getSomeVariable(); 
    System.out.println("All is flux! Some variable is now " + someVariable); 
    } 
} 
+0

리플렉션을 사용하지 못했지만 변경 리스너와 비슷한 요구 사항이 있습니다. 그러나 변수 값은 도저에 의해 설정되고 반사를 통해 작동합니다. – Vikash

관련 문제