gpt4 book ai didi

java - 如果需要支持两个版本,如何处理 Java 中的包名称更改?

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

我需要支持依赖项的两个版本,它们具有相同的 API,但包名称不同。

如何在不维护代码的两个版本(唯一的更改是导入语句)的情况下处理此问题?

对于局部变量,我想我可以使用反射(丑陋!),但我使用有问题的类作为方法参数。如果我不想传递 Object 实例,我还能做什么来从包名称中抽象出来?

是否可以将一个与 API 兼容的自制接口(interface)应用于现有实例,并将它们作为该接口(interface)的实例传递?

我实际上主要在我的代码中使用 xtend,如果这改变了答案。

最佳答案

由于您使用的是 Xtend,因此这里有一个利用 Xtend's @Delegate annotation 的解决方案。不过,可能有不基于 Xtend 的更好的解决方案,并且这只适用于仅包含具有完全相同的方法签名的接口(interface)的简单 API。

因此,假设您在不同的包中具有具有完全相同的方法签名的接口(interface),例如像这样:

package vendor.api1

interface Greeter {
def void sayHello(String name)
}
package vendor.api2

interface Greeter {
def void sayHello(String name)
}

然后您可以将两者组合成一个接口(interface),并且仅在代码中使用这个组合接口(interface)。

package example.api

interface Greeter extends vendor.api1.Greeter, vendor.api2.Greeter {
}

到目前为止,这在 Java 中也是可能的,但是您必须为每个接口(interface)方法编写大量样板才能使其工作。在 Xtend 中,您可以使用 @Delegate 自动生成所有内容,而无需关心接口(interface)有多少方法或它们的外观:

package example.internal

import example.api.Greeter
import org.eclipse.xtend.lib.annotations.Delegate
import org.eclipse.xtend.lib.annotations.FinalFieldsConstructor

@FinalFieldsConstructor
class GreeterImpl implements Greeter {
@Delegate val Api delegate
}

@FinalFieldsConstructor
class Greeter1Wrapper implements Greeter {
@Delegate val vendor.api1.Greeter delegate
}

@FinalFieldsConstructor
class Greeter2Wrapper implements Greeter {
@Delegate val vendor.api2.Greeter delegate
}

Greeter1WrapperGreeter2Wrapper 实际上都实现了这两个包的接口(interface),但由于签名相同,所有方法都转发到各自的委托(delegate)实例。这些包装器是必要的,因为 GreeterImpl 的委托(delegate)需要实现与 GreeterImpl 相同的接口(interface)(如果包相同,通常一个委托(delegate)就足够了)。

现在您可以在运行时决定使用哪个版本。

val vendor.api1.Greeter greeterApi1 = ... // get from vendor API
val vendor.api2.Greeter greeterApi2 = ... // get from vendor API

val apiWrapper = switch version {
case 1: new Greeter1Wrapper(greeterApi1)
case 2: new Greeter2Wrapper(greeterApi2)
}

val example.api.Greeter myGreeter = new GreeterImpl(apiWrapper)
myGreeter.sayHello("world")

可以对所有接口(interface)重复此模式。通过实现自定义 Activity 注释处理器,您可以避免更多的样板代码,该处理器从单个注释生成所有必需的类。

关于java - 如果需要支持两个版本,如何处理 Java 中的包名称更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57555539/

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