Я хочу сделать что-то подобное в 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
Есть 3 различных способа настроить это:
Thrower
Внутри Catcher
Catcher
Внутри Thrower
Thrower
и Catcher
внутри другого класса в этом примереTest
ПРИМЕР РАБОЧЕГО GITHUB I CITING По умолчанию используется вариант 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. А то, что у тебя на ТА, сломано.
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) {
}
});