2013-03-15 35 views
30

Giả sử tôi có một số biến được xác định bằng cách sử dụng câu lệnh int someVariable;. Trong khi mã chạy, giá trị của biến thay đổi.Cách tạo trình nghe thay đổi cho biến?

Làm cách nào để theo dõi các thay đổi trong biến này? Làm cách nào tôi có thể triển khai một số Trình xử lý hoạt động như onSomeVariableChangedListener?

Tôi cũng cần phải biết khi nào một số phương pháp khác trong một trang đã được thực hiện để tôi có thể đặt Trình nghe trong một lớp khác.

+0

Bạn có muốn làm điều này với mục đích gỡ lỗi hoặc làm bạn muốn sử dụng điều này trong mã sản xuất? –

+0

trong mã sản xuất – Sinigami

Trả lời

26

Đây là một trong nhiều lý do để che giấu đằng sau các biến setter/getter cặp. Sau đó, trong setter bạn có thể thông báo cho người nghe của bạn rằng biến này đã được sửa đổi theo cách thích hợp. Như những người khác đã nhận xét, không có cách nào được xây dựng để thực hiện chính xác những gì bạn muốn, bạn cần tự mình thực hiện nó.

Hoặc Benjamin mang đến một mẫu thú vị, được gọi là mẫu Decorator, có thể hữu ích cho bạn nếu mã không được sửa đổi. You can look up more info at wikipedia

Ý tưởng là tạo một trình bao bọc tương thích xung quanh một đối tượng. Cho phép nói đối tượng của bạn trong câu hỏi là loại MyClass.

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

class MyLoggedClass extends MyClass{ 
    MyClass myObject; 

    publc void doFunc(){ 
     //Log doFunc Call 

     myObject.doFunc(); 

    } 
} 

thay vì

MyClass object = new MyClass(); 

Bạn sẽ sử dụng

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

Bây giờ còn lại của bạn của mã sẽ sử dụng đối tượng theo bình thường, ngoại trừ việc mỗi lần gọi hàm sẽ được đăng nhập, hoặc thông báo , v.v.

Như bạn sẽ thấy trong wikipedia, điều này thường được thực hiện thông qua giao diện mà lớp học trong câu hỏi được kế thừa từ, nhưng điều này có thể không thực hiện được trong trường hợp của bạn.

+1

Bạn có thể muốn đề cập đến khái niệm Trang trí, có thể là một cách để thực hiện giải pháp cho vấn đề này, tốt nhất là với một ví dụ cơ bản. –

+0

trong dòng cuối cùng của bạn, bạn có nghĩa là 'MyClass object = new MyLoggedObject ...' thay vì '... myLoggedClass ...'? Nếu vậy, bạn có thể vui lòng cập nhật không? Và nếu nó đúng, bạn có thể giải thích không? Cảm ơn. – dbconfession

+0

@dbconfession tốt mắt, tôi sẽ sửa chữa nó theo cách khác, bằng cách đổi tên lớp –

1

Không có cách tích hợp trong Java để nhận thông báo nếu giá trị của bất kỳ biến tùy ý nào thay đổi hoặc nếu một số phương thức đã được gọi.

3

How to Write a Property Change Listener có thể giúp bạn Nó là một cái gì đó liên quan

+0

Theo như tôi có thể nói anh ta muốn nghe những thay đổi trên một biến và _not_ một tài sản –

+0

@BenjaminGruenbaum, theo kiến ​​thức 'biến' của một bean hoặc lớp được gọi là' property', nó không phải là về tệp '.property'. – Patriks

33

Java cung cấp cho bạn triển khai mẫu Observer đơn giản cho loại điều này, nhưng bạn sẽ cần đặt biến quan sát của mình trong một phương pháp quản lý thông báo người nghe. Nếu bạn không thể mở rộng Observable, bạn có thể sử dụng composition (ví dụ, có một thể hiện Observable trong lớp của bạn để quản lý các thông báo), hoặc bạn có thể xem java.util.Observable để có được một ý tưởng về cách cuộn của riêng bạn phiên bản.

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

Điều này không với sự phản ánh, tôi có một yêu cầu tương tự của người nghe thay đổi. Nhưng các giá trị biến được thiết lập bởi dozer, hoạt động thông qua sự phản chiếu. – Vikash

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