gpt4 book ai didi

Java - 强制 super() 调用使用特定依赖项中的构造函数

转载 作者:太空宇宙 更新时间:2023-11-04 12:34:18 25 4
gpt4 key购买 nike

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

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

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

最佳答案

我想出了一个可以在您的场景中工作的解决方案,但它的工作原理与您最初想要解决的问题(解决 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 处理这种遗留行为。它看起来像一个有效的父类(super class)(因为它实现了与 InitialServer 相同的接口(interface),但实际上它只是将所有调用委托(delegate)给它在运行时解析的 InitialServer 实例。

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

委托(delegate)方法可以通过 Eclipse 轻松生成。欲了解更多详情,请参阅 this question on how to generate delegate methods in Eclipse .

关于Java - 强制 super() 调用使用特定依赖项中的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37500558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com