Monitorar atributo de uma classe [RESOLVIDO]

Gente eu quero monitorar um parametro de uma classe

Olhem o exemplo:

public class A{
    int n;//Pode ser outro tipo
}

public class B{

    A a;

    public void acao(){
        //Realiza algo
    }

}

Eu gostaria de executar o metodo ação caso o atributo n tenha sido alterado

algo parecido com os listeners

Ola,

Em java temos um padrão para isto, mas não lembro o nome agora, sei que funciona assim, a classe, bean no caso, tem que “suportar” notificar quando o valor de um atributo é alterado, sendo que é legal vc declarar uma constante que contem o nome do atributo, este “suporte” já é fornecido pela classe java.beans.PropertyChangeSupport.

 
public class A{
  public static final String PROPERTY_NAME_A = "A.a";

  private Object a;

  private PropertyChangeSupport propertyChangeSupport;

  .. // no construtor vc pode iniciar o propertyChangeSupport, ou em outro lugar qq...

  public void addPropertyChangeListener(PropertyChangeListener l){
    this.propertyChangeSupport.addPropertyChangeListener(l);
  }

  public void setA(Object newA){
    Object oldA = this.a;
    this.a = newA;
    propertyChangeSupport.firePropertyChange(PROPERTY_NAME_A, oldA, this.a);
  }

...
}

Bom, vejamos, criamos um bean com 1 atributo, o ‘a’, e criamos uma constante com o nome dele, a ‘PROPERTY_NAME_A’, no setA a gente notifica que o ‘a’ nodou, mas quem vai "escutar’??? são os java.beans.PropertyChangeListener, que no caso da sua pergunta seria a classe B…

Ps.: note que no metodo "setA’, em primeiro eu atualiza o valor de ‘a’ para só depois eu notificar, isto faz parte do padrão, pois assim se o lsitener fizer um “getA” por exemplo, ele vai recuperar sempre o valor atual.

Bom…

Cara pelo que eu entendi sobre seu problema, vc poderia encapsular o atributo n, criando os métodos get e set , e dentro destes métodos chamar o método acao para que quando alterado o valor execute a acao.
Segue exemplo:

class A {
    private int n;

    public int getN() {
        return n;
    }

    public void setN(int n) {
        if(this.n != n) //Quando alterar o n executa a ação se for igual não faz nada
            new B().acao();

        this.n = n;
    }
}

class B {
    public void acao(){
        System.out.println("Chamou a ação!");
    }
}

/**Wolmir - Crie a classe Teste e copie e execute o código */
public class Teste {
    public static void main(String args[]){
        new A().setN(10);
        new A().setN(11);
        new A().setN(12);
    }
}

Espero ter ajudado…
Valeus…

Obrigado BrunoCarlo, sua idéia funcionou!!

	private static final String ALIMENTADOR = "Barramento.parent";  	
	private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

	@Override
	protected void setParent(Alimentador parent){
		propertyChangeSupport.firePropertyChange(ALIMENTADOR, super.parent, parent);
		super.setParent(parent);
	}

[quote=tabocu]Obrigado BrunoCarlo, sua idéia funcionou!!

[code]
private static final String ALIMENTADOR = “Barramento.parent”;
private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

@Override
protected void setParent(Alimentador parent){
	propertyChangeSupport.firePropertyChange(ALIMENTADOR, super.parent, parent);
	super.setParent(parent);
}

[/code][/quote]

Ola, que legal.

Mas só lembrando que as linhas: propertyChangeSupport.firePropertyChange(ALIMENTADOR, super.parent, parent); super.setParent(parent);
Tem que ser invertidas, para ficar assim:

  Alimentador oldParent = this.getParent();
  super.setParent(parent);  
  propertyChangeSupport.firePropertyChange(ALIMENTADOR, oldParent, this.getParent());

E explico o porque desta importancia:
Quando o listener fizer “objeto.getParent()”, o retorno tem que ser igual ao “getNewValue()” do listener. endente?

Isso é verdade mas pro meu uso nao faz diferença uso nao faz diferença

Boa noite Galera,

Estou tentando entender como funciona o monitoramento. Se entendi direito os passos para monitorar um atributo e realizar alguma operação é:

1 - Criar dentro da classe um objeto da classe PropertyChangeSupport;
2 - Depois implementar 2 métodos addPropertyChangeListener e removePropertyChangeListener;
3 - Depois no método set do atributo que quero monitorar registrar a alteração de valor usando o método firePropertyChange;
4 - A classe/Objeto que vai escutar a alteração do objeto deve implementar PropertyChangeListener;
5 - Na classe que está ouvindo implementar o método propertyChange para efetuar a operação que desejar.

É isto mesmo? estes são os passos é assim que funciona?