对于Java生态系统相对较新的人来说,是否有一种相当轻量级的方法来执行Qt和Django等框架对其信令/接收器系统的处理,其中组件可以说“我正在做某事”,以及其他组件可以以一种相当松散耦合的方式处理它吗?
如果这个问题没有通过“单一客观答案”测试,我会提前道歉。
编辑:要添加更多上下文,这与Web服务的数据库驱动的应用程序层相关。某些资源在持久化时,还需要保存包含额外上下文信息的审计记录。在Django中,我通过信令机制来做这件事,或者使用几个现有的库之一。对于Scala程序,我使用回调函数制作了自己的hacky东西,但是使用第一类函数更容易。我毫不怀疑像Swing这样的框架为这种事情提供了设施,但是我(可能是不合理地)将这种依赖添加到目前相当普通的应用程序(不是说Django本身不是一个对香草Python的巨大依赖!)
答案 0 :(得分:4)
在Java中,至少在UI方面,这通常使用listener approach来完成:您注册一个在特定事件发生时调用的侦听器方法。它可能比Qt信号/插槽机制稍微松散耦合......你可能考虑的另一种方法是java message service,它专门用于客户端/服务器系统中基于松散耦合的通信。 Java EE标准。
答案 1 :(得分:4)
如果您正在寻找提供类似于Qt的信号/插槽机制的Java库,那么您应该查看sig4j。它是线程安全的,类型安全的,并支持不同类型的连接。
注意:我是这个图书馆的作者:)
答案 2 :(得分:2)
我同意有关事件驱动编程的其他意见/答案。
您可能对http://eventbus.org感兴趣。这允许您全局广播/接收事件,而无需在每个事件生成器上显式注册侦听器。
答案 3 :(得分: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);
您可以在此处找到示例应用程序: