首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更改、替换或扩展Scala中的第三方Enum (Java)?

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

Stack Overflow用户
提问于 2020-07-15 10:37:45
回答 1查看 65关注 0票数 0

我有一个Scala项目,它使用Service-Factory (第三方Java)和Configuration-Enum (第三方Java)。

我需要用我自己的配置值(不在现有的配置-Enum中表示)调用Factory。

如何处理这个问题?我没有使用Scala的经验,但有一些使用Java的经验。我能用反射或者别的什么吗?

配置-Enum(第三方Java):

代码语言:javascript
复制
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):

代码语言:javascript
复制
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:

代码语言:javascript
复制
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?
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-15 12:01:37

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

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

代码语言:javascript
复制
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,因此,通常通过引用比较来检查某物是否具有某种价值。因此,如果您通过一些非法二进制操作添加了一个新值,我不知道,那么以前进行彻底检查的所有代码现在都会有未处理的情况。这就是为什么编译器将阻止您这样做的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62913008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档