Java-signal/slots机制

Java-signal/slots机制,java,signals-slots,Java,Signals Slots,对于Java生态系统的新手来说,是否有一种相当轻量级的方式来完成像Qt和Django这样的框架在其信令/接收器系统中所做的事情,其中组件可以说“我正在做某事”,而其他组件可以以一种相当松耦合的方式来处理 如果这个问题没有通过“单一目标答案”测试,我会提前道歉 编辑:为了添加更多的上下文,这与web服务的数据库驱动应用程序层有关。某些资源在持久化时,还需要保存包含额外上下文信息的审核记录。在Django中,我会通过信令机制来实现这一点,或者使用现有的几个库中的一个来实现这一点。对于Scala程序,

对于Java生态系统的新手来说,是否有一种相当轻量级的方式来完成像Qt和Django这样的框架在其信令/接收器系统中所做的事情,其中组件可以说“我正在做某事”,而其他组件可以以一种相当松耦合的方式来处理

如果这个问题没有通过“单一目标答案”测试,我会提前道歉


编辑:为了添加更多的上下文,这与web服务的数据库驱动应用程序层有关。某些资源在持久化时,还需要保存包含额外上下文信息的审核记录。在Django中,我会通过信令机制来实现这一点,或者使用现有的几个库中的一个来实现这一点。对于Scala程序,我使用回调函数制作了自己的黑客程序,但使用第一类函数更容易。我毫不怀疑像Swing这样的框架为这类事情提供了便利,但我(也许是不合理的)很清楚在目前相当普通的应用程序中添加这样的依赖性(并不是说Django本身不是对普通Python的大规模依赖!)

在Java中,至少在UI方面,这通常是通过:注册一个侦听器方法来完成的,该方法在特定事件发生时被调用。它可能比Qt信号/插槽机制松耦合得少一些,不过。。。另一种方法可能是java,它是专门设计用于基于java EE标准的客户机/服务器系统松散耦合的通信。

< P>我同意关于事件驱动编程的其他评论/答案。
你可能会对它感兴趣。这允许您全局广播/接收事件,而无需在每个事件生成器上显式注册侦听器。

在要接收信号的类中,您可以定义广播接收器:

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);
您可以在此处找到一个示例应用程序:


如果您正在寻找一个Java库,它提供类似于Qt的信号/插槽机制,那么您应该看看。它是线程安全、类型安全的,并且支持不同类型的连接


注意:我是这个库的作者:)

你在说什么?在一个中到大型的组件级别上,你有实现2个或更多方法的接口,我认为依赖注入已经赢得了如何耦合组件的战斗。在小级别上(如向GUI按钮提供操作),侦听器模式是王者。@normalocity:是的,但与GUI编程没有直接关系。JavaFx通过其绑定API.True提供了类似的机制。但有时,即使使用匿名类,也仍然过于结构化。然而,QtJambi(用Java实现的Qt框架)利用反射来提供信号槽,IMHO导致行数减少和代码更清晰,但失去了类型安全性。