如何在Scala中更改、替换或扩展第三方Enum(Java)



我有一个Scala项目,它使用服务工厂(第三方Java(和配置枚举

我需要用我自己的配置值(在现有的配置枚举中没有表示(来调用工厂。

如何处理这个问题?我没有Scala的经验,但有一些Java的经验。我可以使用反射或其他功能吗?

配置枚举(第三方Java(:

public enum Config {
ENV1("host-x"),
ENV2("host-y");

private final String url;
Config (String url) {
this.url = url;
}
public String getUrl() {
return url;
}
}

服务工厂(第三方Java(:

public class Factory {
private final Service service;
public Factory(Config config) {
this.service = initService(config.getUrl()); // the problematic line...
}
public Service getService() {
return service;
}
}

我的Scala项目:

def doSomting: Unit = {
val aConfig: Config = Config.valueOf("ENV1")
new Factory(aConfig).getService().start() // uses host-x from the enum ENV1
// How can I pass my own host (host-z) into the Factory?
}

不能为现有枚举创建新值。但是您可以创建一个新类型,它是旧枚举和扩展的超集。

如果你可以控制呼叫站点,你可以引入一些扩展,比如:Either[OriginalEnum, ExtensionsEnum],你可以在其中区分一组值和另一组值,例如,在你有扩展的地方传递原始值,你可以提供一个单独的行为:

type ExtendedEnum = Either[OriginalEnum, ExtensionEnum]
def expectingOriginal(value: OriginalEnum) Something = ...
def extendedEnum(value: ExtendedEnum) = value match {
case Left(original)  => expectingOriginal(original)
case Right(extended) => // special handling extending original behavior
}

如果你做不到…好吧,那么你别无选择。枚举的设计方式是,在编译和运行时都有固定数量的枚举,因此,例如,检查某个枚举是否是某个值的枚举通常是通过引用比较来完成的。因此,如果你通过一些非法的二进制操作添加一个新值,我不知道,那么所有用于进行彻底检查的代码现在都会有未处理的情况。这就是为什么编译器会阻止你这么做

最新更新