[英]How do you get event notifications back to the main program class of a Java console app?
我從C#入Java,實際上我只是想弄清楚如何在Java世界中做事。 我在IntelliJ IDEA中運行Java 8。 我發現這說明Java中的事件基本上是通過手動注冊和接口方法調用手動完成的。 該代碼示例有足夠的問題,我認為它從未被編譯過。 清理了一點之后,我有了這個:
接口MetronomeEvent:
public interface MetronomeEvent {
void Tick(Date tickDate);
}
類EventFiringSource:
public class EventFiringSource {
// Our collection of classes that are subscribed as listeners of our
protected List<MetronomeEvent> _listeners=new ArrayList();
// Method for listener classes to register themselves
public void addMetronomeEventListener(MetronomeEvent listener)
{
_listeners.add(listener);
}
// "fires" the event
protected void fireMetronomeEvent()
{
if (_listeners != null && !_listeners.isEmpty())
{
for (MetronomeEvent e:_listeners)
{
e.Tick(new Date());
}
}
}
public void Start()
{
fireMetronomeEvent();
}
}
主控制台應用程序:
public class MainApp implements MetronomeEvent {
public static void main(String[] args) {
EventFiringSource source = new EventFiringSource();
source.addMetronomeEventListener(this); // Adds itself as a listener for the event
source.Start();
}
public void Tick(Date tickDate)
{
System.out.println(tickDate.toString());
}
}
剩下的一個錯誤是source.addMetronomeEventListener(this);
編譯器抱怨它無法從靜態上下文引用MyApp.this
。 這是有道理的,但是我看不出有什么辦法可以在主程序類上實現MetronomeEvent接口之后,將其實際傳遞給source.addMetronomeEventListener()
進行注冊。 是否可以直接為事件注冊主程序類? 我是否應該創建並注冊一個實現MetronomeEvent的偵聽器類,該類將代表主應用程序運行? 像這樣?
public class Listener implements MetronomeEvent {
public void Tick(Date tickDate){
System.out.println(tickDate.toString());
}
}
接着:
public static void main(String[] args) {
EventFiringSource source = new EventFiringSource();
Listener l=new Listener();
source.addMetronomeEventListener(l); // Adds another object to listen on behalf of main()
source.Start();
}
根據文斯·埃米格(Vince Emigh)的評論/回答,我得到了有關lamda表達式的Oracle文檔以及有關方法引用的 這一文檔 。 到目前為止,我已經找到3種方法來做到這一點。
1)匿名班:
source.addMetronomeEventListener(
new MetronomeEvent() {
@Override
public void Tick(Date tickDate) {
System.out.println("anonymous class:");
System.out.println(tickDate.toString());
}
}
); // Adds itself as a listener for the event
2)Lambda表達式:
source.addMetronomeEventListener(d -> System.out.println("lambda:\n"+d.toString()));
3)方法參考,這是我最熟悉的方法參考。 在主類中定義了一個方法:
public static void processTick(Date tickDate){
System.out.println("method reference:");
System.out.println(tickDate.toString());
}
...然后在main()的主體中將其添加為事件處理程序,如下所示:
source.addMetronomeEventListener(MainApp::processTick);
這與事件無關,通常與main()
和靜態方法有關。
我建議將您的main()編寫為
public static void main(String[] args) {
new MainApp(args).execute();
}
這樣,您立即從靜態函數世界跳入了面向對象的世界。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.