Frage von GedankenGruetze, 4

Java RMI: extend UnicastRemoteObject oder nicht?

Ist schon ein bisschen her, dass ich mit Java RMI gearbeitet habe. Früher hab ich Server in etwa so implementiert

public class ServerImpl extends UnicastRemoteObject implements Server
{
       //macht halt sein Zeug 

    public static void main(String[] args) 
    {
        LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
        Naming.bind(Server.DEFAULT_NAME, new ServerImpl());
    }
}   

Im Oracle Java-Tutorial leitet die Server-Klasse allerdings nicht von UnicastRemoteObject ab, weshalb die main-Methode auch anders ausfällt. https://docs.oracle.com/javase/tutorial/rmi/implementing.html

public static void main(String[] args) {
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }
        try {
            String name = "Compute";
            Compute engine = new ComputeEngine();
            Compute stub =
                (Compute) UnicastRemoteObject.exportObject(engine, 0);
            Registry registry = LocateRegistry.getRegistry();
            registry.rebind(name, stub);
            System.out.println("ComputeEngine bound");
        } catch (Exception e) {
            System.err.println("ComputeEngine exception:");
            e.printStackTrace();
        }
    }

Meine Frage ist, ob eine der beiden Methoden irgendwie bevorzugt wird oder ist das Jacke wie Hose? Habe im StackOverflow einen Kommentar zu einer Antwort gelesen, dass man extends UnicastRemoteObject nicht (mehr) verwenden soll. Ich kann allerdings nirgends finden wieso man es nicht tun sollte, falls es denn stimmt.

Antwort
von regex9, 2

Du kannst weiterhin von UnicastRemoteObject ableiten, wenn es denn notwendig ist. Achte dabei einfach darauf, was in der Dokumentation steht, denn einige Methoden nutzen noch das veraltete Prinzip, statisch Stubs zu generieren https://docs.oracle.com/javase/8/docs/api/java/rmi/server/UnicastRemoteObject.ht...

Vorteile der 2. Methode:

  • Die Klasse kann eine andere Basisklasse erweitern
  • Du bekommst den Stub (Typ: Remote) zurück, der das Objekt exportiert

Nachteile der 2. Methode:

  • Mehr Code, nicht so viel geschieht "automatisch" wie bei einer Vererbung
  • Momentan ist die definierte Exception nicht gerade eindeutig

Keine passende Antwort gefunden?

Fragen Sie die Community