Я хочу зробити щось подібне на Java, але не знаю способу:
Коли подія "об'єкт 1 скаже" привіт ", тоді об'єкт 2 відповідає на цю подію, кажучи" привіт ".
Чи може хтось надати мені підказку чи зразок коду?
Я хочу зробити щось подібне на Java, але не знаю способу:
Коли подія "об'єкт 1 скаже" привіт ", тоді об'єкт 2 відповідає на цю подію, кажучи" привіт ".
Чи може хтось надати мені підказку чи зразок коду?
Відповіді:
Ви, мабуть, хочете заглянути в модель спостерігача .
Ось приклад коду, щоб розпочати роботу:
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..."
}
}
Пов'язана стаття: Java: Створення користувацької події
Те, що ви хочете, - це реалізація структури спостерігача . Ви можете зробити це повністю самостійно або використовувати класи java, як java.util.Observer
іjava.util.Observable
Можна налаштувати це три різні способи:
Thrower
всередині Catcher
Catcher
всередині Thrower
Thrower
і Catcher
всередині іншого класу в цьому прикладіTest
ПРИКЛАД РОБОЧОГО ГІТУБУ Я ЦИТУЮ За замовчуванням Варіант 3, щоб спробувати інші просто відменшити "Optional
" код код класу, який Ви хочете бути головним, і встановити цей клас як${Main-Class}
змінну уbuild.xml
файлі:
4 Необхідні речі для викидання бічного коду:
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 Речі, необхідні у файлі класу, щоб отримувати події від класу
/*_______________________________________________________________*/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
є статичною, і немає такого поняття, як this
у статичній функції. Вам потрібно new Catcher1()
десь створити і замість цього передати цей екземпляр. 1.5 також не дозволяв this
у статичному контексті; Я впевнений, що це ніколи не було дозволено.
this
знаходиться в конструкторі, а не в main
. Ось чому це працює. Перемістіть його main
, і я гарантую, що цього не стане. Це те, що люди намагаються сказати вам, і те, що намагається зробити ваша відповідь. Я не біда, що на Github - мені байдуже, що на SO. І те, що у вас на SO, порушено.
this
з main
, який не буде компілюватися в жодній випущеній версії Java. Якщо б ця частина була замість конструктора, або якщо main
створена new Catcher1()
та використана, то замість цього this
вона повинна працювати навіть у 1.6+.
static
, називається методом класу. Метод класу завжди викликається без посилання на конкретний об'єкт. Спроба посилання на поточний об'єкт за допомогою ключового слова this
або ключового слова super
або посилання на параметри типу будь-якого оточення декларація в тілі методу класу призводить до помилки у компіляції. " - JLS для Java 5, §8.4.3.2
Далі не зовсім те саме, але схоже, я шукав фрагмент, щоб додати виклик методу інтерфейсу, але знайшов це питання, тому вирішив додати цей фрагмент для тих, хто його шукав, як я, і знайшов це питання :
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);
}
}
Використання полягає в наступному:
myClassObj.setDataLoadFinishedListener(new MyClass.DataLoadFinishedListener() {
@Override
public void onDataLoadFinishedListener(int data_type) {
}
});