2012-09-21 14 views
5

Para alguien relativamente nuevo en el ecosistema de Java, ¿existe una forma bastante ligera de hacer lo que frameworks como Qt y Django hacen con su sistema de señalización/receptor, donde los componentes pueden decir "I'm doing algo ", y otros componentes pueden manejar eso de una manera bastante flexible?Java - mecanismo de señal/slots

Pido disculpas de antemano si esta pregunta no supera la prueba de "respuesta de objetivo único".

Editar: Para agregar un poco más de contexto, esto está relacionado con una capa de aplicación basada en la base de datos para un servicio web. Ciertos recursos, cuando persisten, también necesitan guardar un registro de auditoría que contenga información de contexto adicional. En Django, haría esto a través del mecanismo de señalización, o usaría una de varias bibliotecas existentes que hacen justamente eso. Para un programa Scala, he creado mi propio hacky usando funciones de devolución de llamada, pero es más fácil con las funciones de primera clase. No tengo ninguna duda de que los marcos como Swing ofrecen facilidades para este tipo de cosas, pero estoy (quizás injustificadamente) asustado de agregar tal dependencia a lo que es actualmente una aplicación bastante simple (no es que Django no sea en sí mismo una dependencia masiva en Python vainilla!)

+0

¿Estás hablando de [modelos basados ​​en eventos] (http://en.wikibooks.org/wiki/Java_Programming/Event_Handling)? – jefflunt

+3

En un nivel de componente medio a grande donde tiene interfaces que implementan 2 o más métodos, creo que Dependency Injection ha ganado la batalla sobre cómo acoplar componentes. En el nivel pequeño (como proporcionar una acción a un botón GUI), el patrón de Escucha es el rey. –

+0

@normalocity: sí, pero no directamente relacionado con la programación de GUI. – Mikesname

Respuesta

3

En Java, al menos en el lado de la interfaz de usuario, esto generalmente se hace con el listener approach: registra un método de escucha al que se llama cuando ocurren eventos específicos. Sin embargo, podría estar un poco menos acoplado que el mecanismo de ranura/señal de Qt ... Otro enfoque que podría considerar es el message service de Java, que está especialmente diseñado para la comunicación débilmente acoplada en sistemas cliente/servidor basados ​​en el estándar Java EE.

+1

cierto.Pero a veces incluso el uso de clases anónimas sigue siendo demasiada estructura. Sin embargo, QtJambi (el marco de Qt implementado en Java) utiliza Reflection para proporcionar slots de señales y resultados de mi humilde opinión en el recuento de líneas más bajo y código más claro, pero pierde seguridad de tipo. –

2

Estoy de acuerdo con los otros comentarios/respuestas con respecto a la programación dirigida por eventos.

Usted podría estar interesado en http://eventbus.org. Esto le permite transmitir/recibir eventos globalmente sin tener que registrar oyentes explícitamente en cada productor de eventos.

0

En la clase en la que desea recibir la señal, se puede definir un 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 
} 

Luego, en la clase en la que desea enviar la señal, sólo tiene que hacer:

Intent signalIntent = new Intent(Constants.ACTION_UPDATE_PROFILE_UI); 

agregue el tipo de datos que desea a la intención y luego difúndalo como:

sendBroadcast(signalIntent); 

Usted ca n encontrar un ejemplo de aplicación aquí:

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

3

Si está buscando una biblioteca de Java que proporciona un mecanismo de señal/ranura similar a Qt entonces usted debe echar un vistazo a sig4j. Es seguro para roscas, seguro y admite diferentes tipos de conexiones.

Nota: Soy el autor de esta biblioteca :)

Cuestiones relacionadas