2016-02-19 8 views
8

mam klasę o nazwie A i jego klasa komponent o nazwie B.Jak powiadomić komponent klasy zdarzenia?

public class A { 
    B myB; 

    ... 
    public void bWasUpdated(){ 
     ... 
     List<String> list = myB.connections; 
    } 
} 

Jeśli mam instancję B w klasie A, a jeśli to wystąpienie B jest aktualizowany w jakiś sposób, w jaki mogę powiadomić moje wystąpienie klasy A i zadzwoń pod numer bWasUpdated()?

Próbowałem interfejsów, ale skończyło się naprawdę zdezorientowany. Sądzę, że nie bardzo rozumiem, jak przekazywać dane między obiektem a jego składnikiem.

EDIT

public class B { 
    ArrayList<String> connections; 

    .... 

    public void listen(){ 

     ... 
     if(foundNewConnection){ 
      this.connections.add(theNewConnection); 
      //Notify class A about this new connection; 
     } 
    } 
} 
+0

W jaki sposób eksponujesz 'A.myB' na zewnątrz? Jeśli używasz metody _setter_, wtedy będziesz wiedzieć, kiedy instancja 'B' została zaktualizowana. –

+0

Czy możesz podać więcej informacji o klasie B? – waxtah

+0

Oczywiście, nazywam klasę B menedżerem ContactManager i zasadniczo nasłuchuje, używając gniazd, dla połączeń przychodzących. Moja instancja b utrzymuje listę tych połączeń i chcę powiadomić klasę A, gdy zostanie nawiązane nowe połączenie! – wayway

Odpowiedz

11

Należy użyć odbiornika Listener, który jest formą wzorca o nazwie Observer pattern.

pierwsze, dodać ten interfejs do klasy B:

public interface ChangeListener { 
    public void onChangeHappened(); 
} 

drugie, dodać zmienną słuchacza do B z seter:

private ChangeListener listener; 

public void setChangeListener(ChangeListener listener) { 
    this.listener = listener; 
} 

trzecie, dokonać implementować interfejs ChangeListener i zarejestrować sam jako słuchacz:

public class A implements ChangeListener { 

public A() { 
    myB = new B(); 
    myB.setChangeListener(this); 
} 

... 

public void onChangeHappened() { 
    // do something with B now that you know it has changed. 
} 

I na koniec, zadzwoń do słuchacza w środku B gdy coś się zmieni:

public void someMethodInB() { 
    // change happened 
    if (listener != null) { 
     listener.onChangeHappened(); 
    } 
} 
+0

Ten wzór wydaje się dokładnie tym, czego potrzebowałem! Spróbuję! – wayway

+0

Dziękuję za wyjaśnienie! Zdecydowanie rozumiem, jak lepiej używać teraz interfejsów lepiej! – wayway

+0

Twoje powitanie! Cieszę się, że pomogło. – FlyingPumba

3

jeśli B - wewnętrzna klasy A, można powołać się w ustawiające B (lub inny stan modyfikatory) A.this.bWasUpdated();

+0

Chcę uniknąć polegania na statycznych metodach dla A. – wayway

+1

oraz dla tej odpowiedzi nie potrzebujesz statycznych metod. Działa bez problemów bez interfejsów (jeśli klasa B -inner A) – Bharatesh

Powiązane problemy