【问题标题】:Java - Forcing a super() call to use constructor from specific dependencyJava - 强制 super() 调用使用来自特定依赖项的构造函数
【发布时间】:2016-09-26 19:14:14
【问题描述】:

我在 Eclipse Mars 中有一个设置,其中有两个依赖项。两者都是同一个程序,但版本不同。在这个程序中,有一个类叫做 InitialHandler。该类的构造函数在两个版本的程序之间从 InitialHandler(ProxyServer, ListenerInfo) 更改为 InitialHandler(BungeeCord, ListenerInfo)。 BungeeCord 是 ProxyServer 的子类。

我正在尝试创建一个与构造函数的新版本和旧版本兼容的类。为此,我的类还有两个将各自的参数作为输入的构造函数。问题是,在应该接受 BungeeCord 输入的构造函数中,super() 调用仍在使用旧依赖项中的构造函数,它使用 ProxyServer。 See a screenshot here

如何强制 super() 调用使用带有 BungeeCord 参数的构造函数版本?

【问题讨论】:

    标签: java parameters constructor dependencies super


    【解决方案1】:

    我想出了一个可以在您的场景中工作的解决方案,但它的工作方式与您最初想要解决的问题(super 调用的解决)略有不同:

    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
    }
    

    基本上,InitialServerLegacyDelegate 处理这种遗留行为。它看起来像一个有效的超类(因为它实现了与InitialServer 相同的接口,但实际上它只是将所有调用委托给它在运行时解析的InitialServer 实例。

    您可能面临的一个问题是:如果您的班级在OpenInitialHandler(ProxyServer proxyServer, ListenerInfo listener) 获得输入,其中ProxyServer 不是BungeeCord 类型。在这种情况下,如果存在较新的依赖项(使用BungeeCord 构造函数)并且它获得非BungeeCord-input,则实现将失败并返回ClassCastException

    Eclipse 可以很容易地生成委托方法。详情请见this question on how to generate delegate methods in Eclipse

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 2020-10-04
      • 1970-01-01
      • 2012-06-29
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多