Java - 信号/槽机制

7
对于相对较新的Java生态系统,是否有一种相对轻量级的方法来完成类似Qt和Django框架中的信号/接收器系统所做的工作,其中组件可以说“我正在做某事”,其他组件可以以相对松散的方式处理它?
如果这个问题不能通过单一目标回答测试,则提前道歉。
编辑:为了增加一些背景,这与Web服务的基于数据库驱动的应用程序层有关。在持久化某些资源时,还需要保存包含额外上下文信息的审计记录。在Django中,我会通过信号机制来实现这一点,或者使用几个现有的库来完成这一点。对于Scala程序,我使用回调函数制作了自己的hacky东西,但使用一级函数更容易。我毫不怀疑,像Swing这样的框架提供了这种类型的设施,但我(也许是不合理的)不愿将这样的依赖项添加到目前相当普通的应用程序中(尽管Django本身就是vanilla Python的一个巨大依赖项!)。

你是指的 事件驱动模型 吗? - jefflunt
3
在组件级别中等到大型的情况下,当你有接口实现2个或更多方法时,我认为依赖注入已经赢得了如何耦合组件的战斗。在小范围内(例如为GUI按钮提供操作),监听器模式是首选。 - Darryl Miles
@normalocity:是的,但与GUI编程不直接相关。 - Mikesname
JavaFX 通过其 Bindings API 提供了类似的机制。 - Eng.Fouad
4个回答

4
如果你正在寻找一个类似于Qt的信号/插槽机制的Java库,那么你应该看看sig4j。它是线程安全的、类型安全的,并支持不同类型的连接。
注意:我是这个库的作者 :)

4
在Java中,至少在UI方面,这通常是使用监听器方法完成的:您注册一个监听器方法,当特定事件发生时调用该方法。尽管可能比Qt信号/槽机制稍微耦合紧密...您可以考虑的另一种方法是Java 消息服务, 它是专门为基于Java EE标准的客户端/服务器系统中的松散耦合通信而设计的。

1
真的。但有时即使使用匿名类仍然太多结构了。然而,QtJambi(用Java实现的Qt框架)利用反射提供信号槽,在我看来可以减少代码行数并使代码更清晰,但会失去类型安全性。 - Darryl Miles

2

我同意其他评论/答案关于事件驱动编程的观点。

你可能会对http://eventbus.org感兴趣。它允许你全局广播/接收事件,而不必在每个事件生产者上显式注册侦听器。


1
在您想要接收信号的类中,您可以定义BroadcastReceiver:
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        updateUI();
    }
};

@Override
public void onPause() {
    super.onPause();
    getActivity().unregisterReceiver(broadcastReceiver);
}

@Override
public void onResume() {
    super.onResume();
    getActivity().registerReceiver(broadcastReceiver, new IntentFilter(Constants.ACTION_UPDATE_PROFILE_UI)); // the constant is to identify the type of signal, it can be any string you want
}

然后在你想要发送信号的类中,只需执行以下操作:

Intent signalIntent = new Intent(Constants.ACTION_UPDATE_PROFILE_UI);

将您想要的数据类型添加到意图中,然后像这样广播它:

sendBroadcast(signalIntent);

您可以在这里找到一个示例应用程序:

https://github.com/nickfox/Update-Android-UI-from-a-Service


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接