2016-02-19 13 views
8

Tôi đã lớp tên là A và lớp thành phần của nó được gọi là B.Làm cách nào để thông báo cho thành phần lớp học của sự kiện?

public class A { 
    B myB; 

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

Nếu tôi có một thể hiện của B trong lớp học của tôi A và nếu điều đó thể hiện của B được cập nhật bằng cách nào đó, làm thế nào tôi có thể thông báo dụ của tôi về lớp A và gọi bWasUpdated()?

Tôi đã thử giao diện nhưng cuối cùng đã thực sự nhầm lẫn. Tôi đoán tôi không hoàn toàn hiểu làm thế nào để vượt qua dữ liệu giữa một đối tượng và thành phần của nó.

EDIT

public class B { 
    ArrayList<String> connections; 

    .... 

    public void listen(){ 

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

Bạn đang phơi bày 'A.myB' với thế giới bên ngoài như thế nào? Nếu bạn đang sử dụng phương thức _setter_, thì bạn sẽ biết khi nào thể hiện 'B' đã được cập nhật. –

+0

Bạn có thể cung cấp thêm thông tin về lớp B không? – waxtah

+0

Chắc chắn, tôi gọi lớp B là một ContactManager và về cơ bản nó đang lắng nghe, sử dụng Sockets, cho các kết nối đến. Ví dụ của tôi về b duy trì danh sách các kết nối này và tôi muốn thông báo cho lớp A khi có kết nối mới! – wayway

Trả lời

11

Bạn nên sử dụng Trình nghe, là một dạng của mẫu được gọi là Observer pattern.

Đầu tiên, thêm giao diện này đến lớp B của bạn:

public interface ChangeListener { 
    public void onChangeHappened(); 
} 

Thứ hai, thêm một biến người nghe đến B với một setter:

private ChangeListener listener; 

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

Thứ ba, thực hiện chương trình thực hiện các giao diện ChangeListener và đăng ký chính nó với tư cách người nghe:

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. 
} 

Và cuối cùng nhưng không kém phần quan trọng, hãy gọi người nghe của bạn bên trong B khi có điều gì đó thay đổi:

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

Mẫu này có vẻ giống như những gì tôi cần! Tôi sẽ cho nó nó một cơ hội! – wayway

+0

Cảm ơn bạn vì câu trả lời rõ ràng này! Tôi chắc chắn hiểu làm thế nào để sử dụng đúng cách sử dụng giao diện tốt hơn bây giờ! – wayway

+0

Chào mừng bạn! Tôi rất vui vì nó đã giúp. – FlyingPumba

3

nếu B - lớp bên trong của A, sau đó bạn có thể gọi trong setters B (hoặc nhà nước bổ khác) A.this.bWasUpdated();

+0

Tôi muốn tránh dựa vào các phương pháp tĩnh cho A. – wayway

+1

cũng cho câu trả lời này bạn không cần phương pháp tĩnh. Nó hoạt động tốt mà không có giao diện (nếu lớp B-class A) – Bharatesh

Các vấn đề liên quan