Tôi muốn làm một cái gì đó như thế này trong Java nhưng tôi không biết cách:
Khi sự kiện "đối tượng 1 nói 'xin chào'" xảy ra, thì đối tượng 2 sẽ phản hồi lại sự kiện đó bằng cách nói "xin chào".
Ai đó có thể cho tôi một gợi ý hoặc mã mẫu?
Tôi muốn làm một cái gì đó như thế này trong Java nhưng tôi không biết cách:
Khi sự kiện "đối tượng 1 nói 'xin chào'" xảy ra, thì đối tượng 2 sẽ phản hồi lại sự kiện đó bằng cách nói "xin chào".
Ai đó có thể cho tôi một gợi ý hoặc mã mẫu?
Câu trả lời:
Bạn có thể muốn nhìn vào mô hình quan sát viên .
Đây là một số mã mẫu để tự bắt đầu:
import java.util.*;
// An interface to be implemented by everyone interested in "Hello" events
interface HelloListener {
void someoneSaidHello();
}
// Someone who says "Hello"
class Initiater {
private List<HelloListener> listeners = new ArrayList<HelloListener>();
public void addListener(HelloListener toAdd) {
listeners.add(toAdd);
}
public void sayHello() {
System.out.println("Hello!!");
// Notify everybody that may be interested.
for (HelloListener hl : listeners)
hl.someoneSaidHello();
}
}
// Someone interested in "Hello" events
class Responder implements HelloListener {
@Override
public void someoneSaidHello() {
System.out.println("Hello there...");
}
}
class Test {
public static void main(String[] args) {
Initiater initiater = new Initiater();
Responder responder = new Responder();
initiater.addListener(responder);
initiater.sayHello(); // Prints "Hello!!!" and "Hello there..."
}
}
Bài viết liên quan: Java: Tạo một sự kiện tùy chỉnh
Những gì bạn muốn là một triển khai của mẫu quan sát . Bạn có thể tự làm hoàn toàn hoặc sử dụng các lớp java như java.util.Observer
vàjava.util.Observable
Có 3 cách khác nhau mà bạn có thể muốn thiết lập:
Thrower
bên trong của Catcher
Catcher
bên trong của Thrower
Thrower
và Catcher
bên trong một lớp khác trong ví dụ nàyTest
VÍ DỤ GITHUB LÀM VIỆC TÔI ĐANG TẠO Mặc định cho Tùy chọn 3, để thử các khối khác chỉ đơn giản là bỏ quaOptional
khối mã "" của lớp bạn muốn là chính và đặt lớp đó làm${Main-Class}
biến trongbuild.xml
tệp:
4 điều cần thiết khi ném mã bên:
import java.util.*;//import of java.util.event
//Declaration of the event's interface type, OR import of the interface,
//OR declared somewhere else in the package
interface ThrowListener {
public void Catch();
}
/*_____________________________________________________________*/class Thrower {
//list of catchers & corresponding function to add/remove them in the list
List<ThrowListener> listeners = new ArrayList<ThrowListener>();
public void addThrowListener(ThrowListener toAdd){ listeners.add(toAdd); }
//Set of functions that Throw Events.
public void Throw(){ for (ThrowListener hl : listeners) hl.Catch();
System.out.println("Something thrown");
}
////Optional: 2 things to send events to a class that is a member of the current class
. . . go to github link to see this code . . .
}
2 Điều cần thiết trong một tệp lớp để nhận các sự kiện từ một lớp
/*_______________________________________________________________*/class Catcher
implements ThrowListener {//implement added to class
//Set of @Override functions that Catch Events
@Override public void Catch() {
System.out.println("I caught something!!");
}
////Optional: 2 things to receive events from a class that is a member of the current class
. . . go to github link to see this code . . .
}
main
tĩnh và không có this
chức năng nào giống như trong hàm tĩnh. Bạn cần tạo một new Catcher1()
nơi nào đó và thay vào đó vượt qua trường hợp đó. 1,5 không cho phép this
trong một bối cảnh tĩnh; Tôi khá chắc chắn rằng nó chưa bao giờ được cho phép.
this
là trong một hàm tạo, không phải trong main
. Đó là lý do tại sao nó hoạt động. Di chuyển nó đến main
, và tôi đảm bảo nó sẽ không. Đó là những gì mọi người đã cố gắng nói với bạn, và câu trả lời của bạn đang cố gắng làm gì. Tôi không cho những gì chết tiệt trên github - tôi quan tâm những gì trên SO. Và những gì bạn có trên SO bị phá vỡ.
this
từ main
đó, nó sẽ không được biên dịch trong bất kỳ phiên bản Java được phát hành nào. Nếu phần đó nằm trong một hàm tạo thay thế, hoặc nếu main
được tạo new Catcher1()
và sử dụng nó thay vì this
, nó sẽ hoạt động, ngay cả trong 1.6+.
static
được gọi là phương thức lớp. Phương thức lớp luôn được gọi mà không tham chiếu đến một đối tượng cụ thể. Cố gắng tham chiếu đối tượng hiện tại bằng cách sử dụng từ khóa this
hoặc từ khóa super
hoặc để tham chiếu các tham số loại của bất kỳ xung quanh khai báo trong phần thân của một phương thức lớp dẫn đến lỗi thời gian biên dịch. " - JLS cho Java 5, §8.4.3.2
Phần sau đây không hoàn toàn giống nhau nhưng tương tự, tôi đã tìm kiếm một đoạn để thêm một cuộc gọi vào phương thức giao diện, nhưng tìm thấy câu hỏi này, vì vậy tôi đã quyết định thêm đoạn trích này cho những người đang tìm kiếm nó như tôi và tìm thấy câu hỏi này :
public class MyClass
{
//... class code goes here
public interface DataLoadFinishedListener {
public void onDataLoadFinishedListener(int data_type);
}
private DataLoadFinishedListener m_lDataLoadFinished;
public void setDataLoadFinishedListener(DataLoadFinishedListener dlf){
this.m_lDataLoadFinished = dlf;
}
private void someOtherMethodOfMyClass()
{
m_lDataLoadFinished.onDataLoadFinishedListener(1);
}
}
Cách sử dụng như sau:
myClassObj.setDataLoadFinishedListener(new MyClass.DataLoadFinishedListener() {
@Override
public void onDataLoadFinishedListener(int data_type) {
}
});