我有一个Scala项目,它使用Service-Factory (第三方Java)和Configuration-Enum (第三方Java)。
我需要用我自己的配置值(不在现有的配置-Enum中表示)调用Factory。
如何处理这个问题?我没有使用Scala的经验,但有一些使用Java的经验。我能用反射或者别的什么吗?
配置-Enum(第三方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;
}
}My Scala-Project:
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?
}发布于 2020-07-15 12:01:37
不能为现有枚举创建新值。但是您可以创建一个新类型,它是旧枚举和扩展的超集。
如果您对调用站点拥有控制权,您可以引入一些扩展,比如: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
}如果你做不到..。那你别无选择。enum的设计方式使编译和运行时都有固定数量的enum,因此,通常通过引用比较来检查某物是否具有某种价值。因此,如果您通过一些非法二进制操作添加了一个新值,我不知道,那么以前进行彻底检查的所有代码现在都会有未处理的情况。这就是为什么编译器将阻止您这样做的原因。
https://stackoverflow.com/questions/62913008
复制相似问题