Je ne connais pas l'implémentation. Je ne pense pas qu'une nouvelle connexion est faite. Mais ce que je sais, c'est que plus vous partagez d'objets à distance, plus il y a d'objets qui dépendent du déréférencement à distance pour récupérer les ordures (il y aura donc plus d'objets qui vivent plus longtemps).
approche alternative
Je recommande une approche mixte. Utilisez l'approche agréable pour le client, mais la mettre en œuvre le pas si beau sens interne:
interface Server {
public Handler getHandler(...);
}
interface Handler extends Serializable {
// it gets copied!
public X doThis(...);
public Y doThat(...);
}
class HandlerImpl implements Handler {
public X doThis(...) {
backDoor.doThis(this, ...);
}
public Y doThat(...) {
backDoor.doThat(this, ...);
}
private BackDoor backDoor;
}
interface BackDoor {
public X doThis(Handler h, ...);
public Y doThat(Handler h, ...);
}
class ServerImpl imlpements Server, BackDoor {
public Handler getHandler(...) {
return /*a handler with a self reference as backdoor, only ONE remote obj shared via TWO interfaces */
}
...
// it does everything
// it receives the handler
}
BackDoor et gestionnaire sont des interfaces sync'ed. Le premier a les méthodes avec Handler comme argument, le dernier a les méthodes pures. Je ne pense pas que ce soit un gros problème. Et les deux interfaces différentes vous permettent de travailler proprement sans que le client ne sache rien et permettent au Handler sériable de faire le sale boulot.
J'espère que vous l'aimez!
J'ai utilisé cette approche pour donner à un client GWT (google web toolkit, donc c'est javascript) des "tickets" pour obtenir des données paginées. La méthode de requête principale (getCustomers) retourne un ticket, et le client peut demander au ticket des données partielles (retreive de X à Y). Le ticket fait: 'pageddataservice.retrieve (this, X, Y)'. Pageddataservice (un service bien connu) trouve le fournisseur de données d'origine pour le ticket (un registre central) et fait provider.retrieve (ticket, X, Y). Cela semble compliqué mais pour le client c'est presque magique. – helios
Si cela ne vous dérange pas, vous pouvez fusionner le serveur et Backdoor en laissant l'utilisateur invoquer 'myServer.doThis (gestionnaire, ...)' ou invoquer le plus agréable 'handler.doThis (...)'. Cela simplifie un peu l'implémentation au prix de la publication des méthodes de réception des gestionnaires. – helios