Java RMI - UnicastRemoteObject: quelle est la différence entre UnicastRemoteObject.exportObject() et s'étend UnicastRemoteObject?

je suis en train de préparer pour un examen, et je vais avoir une question à laquelle j'espère que quelqu'un ici pourrait me répondre.

Il est sur le RMI et les objets distants. Je me demande pourquoi il y a autant de différence entre ces deux implémentations. l'un est l'extension de la UnicastRemoteObject alors que l'autre est l'exportation de l'objet comme un UnicastRemoteObject.

Je n'ai pas vraiment la différence

Interface:

public interface EchoI extends Remote {
   public String echo() throws RemoteException
}

C'est le code du serveur (version 1):

public class EchoImpl extends UnicastRemoteObject implements EchoI {
    public EchoImpl {
        super();
    }

    public static void main (String[] args) {
        try {
            LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
            StoreHouse storehouseImpl = new StorehouseImpl();
            Naming.rebind("//localhost/StoreHouse.SERVICE_NAME", storehouseImpl);
            System.out.println("Server ready");
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    public String echo() {
        return "echo";
    }
}

et ce serait la version 2:

public class EchoImpl implements EchoI {
    public static void main (String[] args) {
        EchoI echoService = new EchoImpl();
        EchoI stub = (EchoI) UnicastRemoteObject.exportObject(echoService, 0);
        Registry registry = LocateRegistry.getRegistry();
        registry.bind("echoService", stub);
        ...
    }
}

Ma question est: quelle est la différence entre ces deux?

À apparaître les premières version de la base de registre est créée explicitement, en outre, la distance de l'objet est créée à l'intérieur d'un rebind?

Je suis vraiment curieux de savoir, pourquoi, dans la première j'ai besoin de créer le registre de moi-même, mais n'ont pas besoin d'exporter l'objet explicitement et simplement relier à l'aide de Naming. Est que l'objet est déjà lié au registre avant, ou pourrais-je l'utiliser lier à la place? Et ce qui se passe, si l'objet n'a pas été précédemment lié et une reliaison est excecuted?

Dans la deuxième version, le registre semble être déjà créé.
Pourquoi est obligatoire de nommer la même que la liaison à un registre directement?

C'est, ce que je pense:

  • la première classe directement implémente l'interface UnicastRemoteObject ce qui signifie, qu'au moment de l'exécution le registre est créé et l'objet est automatiquement exporté vers le RMI registre.
  • que l'objet est déjà liée à un registre, une reliaison plutôt normal d'une liaison doit avoir lieu.
  • ce dernier fait tout cela de manière explicite.