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.
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);
}
}
[quote=tabocu]Obrigado BrunoCarlo, sua idéia funcionou!!
[code]
private static final String ALIMENTADOR = “Barramento.parent”;
private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
Mas só lembrando que as linhas:
propertyChangeSupport.firePropertyChange(ALIMENTADOR, super.parent, parent);
super.setParent(parent);
Tem que ser invertidas, para ficar assim:
E explico o porque desta importancia:
Quando o listener fizer “objeto.getParent()”, o retorno tem que ser igual ao “getNewValue()” do listener. endente?
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?