2016-05-28 5 views
1

Ich habe ein Setup in Eclipse Mars, wo es zwei Abhängigkeiten gibt. Beide sind das gleiche Programm, aber unterschiedliche Versionen. In diesem Programm gibt es eine Klasse namens InitialHandler. Der Konstruktor dieser Klasse hat zwischen den beiden Versionen des Programms von InitialHandler (ProxyServer, ListenerInfo) zu InitialHandler (BungeeCord, ListenerInfo) gewechselt. BungeeCord ist eine Unterklasse von ProxyServer.Java - Erzwingen eines super() - Aufrufs, um den Konstruktor aus einer bestimmten Abhängigkeit zu verwenden

Ich versuche, eine Klasse zu machen, die sowohl mit der neuen als auch der älteren Version des Konstruktors kompatibel ist. Um dies zu tun, hat meine Klasse auch zwei Konstruktoren, die die jeweiligen Parameter als Eingabe nehmen. Problem ist, in dem Konstruktor, der die BungeeCord-Eingabe übernehmen soll, verwendet der super() -Aufruf immer noch den Konstruktor aus der alten Abhängigkeit, die ProxyServer verwendet.

Wie erzwinge ich den Aufruf von super(), um die Version des Konstruktors mit dem BungeeCord-Parameter zu verwenden?

Antwort

0

kam ich mit einer Lösung, die in Ihrem Szenario funktionieren könnte, aber es funktioniert ein wenig anders als das, was man wollte zunächst lösen (die Lösung von super Anrufen):

public class OpenInitialHandler extends InitialServerLegacyDelegate { 

    public OpenInitialHandler(BungeeCord bungee, ListenerInfo listener) { 
     super(bungee, listener); 
    } 

    public OpenInitialHandler(ProxyServer proxyServer, ListenerInfo listener) { 
     super(proxyServer, listener); 
    } 
} 
public class InitialServerLegacyDelegate /* implements and extends whatever you need */ { 

    private static final Constructor<InitialDelegate> targetConstructor = InitialServer.getConstructors()[0]; 

    private final InitialServer delegate; 

    protected InitialServerLegacyDelegate(BungeeCord bungee, ListenerInfo listener) { 
     this(bungee, listener); 
    } 

    protected InitialServerLegacyDelegate(ProxyServer proxyServer, ListenerInfo listener) { 
     try { 
      // This is the critical part. 
      // Instead of binding/checking the constructor parameter types 
      // at compile-time, this will be resolved at runtime. 
      delegate = targetConstructor.newInstance(proxyServer, listener); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    // implement all neccessary interface methods here 
    // and simply make them delegate methods 
} 

Im Wesentlichen behandelt die InitialServerLegacyDelegate dieses Legacy-Verhalten. Es sieht aus wie eine gültige übergeordnete Klasse (weil es die gleichen Schnittstellen wie InitialServer implementiert, aber in Wirklichkeit ist es nur delegiert alle Anrufe auf eine Instanz InitialServer, die es zur Laufzeit löst

Ein Problem, das Sie mit Blick auf sein könnten. Wenn Ihre Klasse einen Eingang an OpenInitialHandler(ProxyServer proxyServer, ListenerInfo listener) wird, wo ProxyServer nicht vom Typ BungeeCord ist. In diesem Fall wird die Umsetzung mit einem ClassCastException fehlschlagen, wenn die neuere Abhängigkeit (mit dem BungeeCord Konstruktor) vorhanden ist, und es wird ein nicht BungeeCord -input.

Delegate-Methoden können einfach von Eclipse generiert werden.Weitere Informationen finden Sie unter this question on how to generate delegate methods in Eclipse.

Verwandte Themen