我一直使用的Java枚举模式的Scala替代

幻影

在Java中,我做了很多数据集成工作。一直出现的一件事是在多个系统之间映射数据。所以我一直在做这样的事情

public enum DataField{
  Field1("xmlField", "dbField", "system1Field";
  private String xml;
  private String db;
  private String sys;

  private DataField(String xml, String db, String sys){
    this.xml = xml;
    this.db = db;
    this.sys = sys;
  }

  public getXml(){
    return this.xml;
  }

  public static DataField valueOfXml(String xml){
    for (DataField d : this.values()){
      if (d.xml.equals(xml)){ return d;}
    }
  }
  bla, bla bla
}

这允许我做的是将字段名称DataField放入所有消息中,并能够映射在多个系统中该字段的名称。因此,在我的XML中,它可能firstname在我的数据库中被调用,first_name但是在我的外部接口系统中,它可能被调用first这种模式将所有这些很好地融合在一起,并以紧密,类型安全的方式使这些类型的系统中的消息传递非常容易。

现在,我不记得为什么Scala更改了枚举实现,但我记得阅读它时才有意义。但是问题是,我将在Scala中使用什么来代替这种设计模式?我讨厌失去它,因为它对于一天中编写的许多系统非常有用且至关重要。

谢谢

ghik

我设法弥补了您的这种情况:

sealed class DataField(val xml: String, val db: String, val sys: String)

object DataField {
  case object Field1 extends DataField("xmlField1", "dbField1", "system1Field")
  case object Field2 extends DataField("xmlField2", "dbField2", "system2Field")
  case object Field3 extends DataField("xmlField3", "dbField3", "system3Field")

  val values = List(Field1, Field2, Field3)

  def valueOfXml(xml: String) =
    values.find(_.xml == xml).get
}

令人讨厌的是,我们必须手动创建values列表。但是,在这种情况下,我们可以进行一些宏修改以减少样板:

import scala.language.experimental.macros
import scala.reflect.macros.Context

object Macros {
  def caseObjectsFor[T]: List[T] = macro caseObjectsFor_impl[T]

  def caseObjectsFor_impl[T: c.WeakTypeTag](c: Context): c.Expr[List[T]] = {
    import c.universe._

    val baseClassSymbol = weakTypeOf[T].typeSymbol.asClass
    val caseObjectSymbols = baseClassSymbol.knownDirectSubclasses.toList.collect {
      case s if s.isModuleClass && s.asClass.isCaseClass => s.asClass.module
    }

    val listObjectSym = typeOf[List.type].termSymbol
    c.Expr[List[T]](Apply(Ident(listObjectSym), caseObjectSymbols.map(s => Ident(s))))
  }
}

然后我们可以这样做:

val values = Macros.caseObjectsFor[DataField]

而不是手动列出所有案例对象。

为此,必须将基类声明为sealed

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我一直在使用Eclipse安装Android的Crashlytics

来自分类Dev

我应该一直使用NSAsynchronousFetchRequest而不是NSFetchRequest吗?

来自分类Dev

我一直在使用的理解和excel公式

来自分类Dev

我的docker build一直关闭

来自分类Dev

我的硬盘一直在旋转

来自分类Dev

我的ID一直返回null

来自分类Dev

我一直未定义

来自分类Dev

一直使用Laravel Eloquent吗?

来自分类Dev

端口 TCP 一直在使用

来自分类Dev

即使没有红线,Java 也一直给我一个错误

来自分类Dev

我一直在获取java.io.NotSerializableException:java.io.ObjectOutputStream

来自分类Dev

我是 firebase 的新手,但一直在使用 java 脚本,但我不明白 snap => 的作用以及为什么使用它

来自分类Dev

我应该一直使用threading.Thread.join()吗?

来自分类Dev

为什么我不应该一直使用ICollection而不是IEnumerable?

来自分类Dev

我可以一直使用findNavController(mView)在Android Studio 3.5.2中找到NavController吗?

来自分类Dev

我需要一直保持在线状态才能使用Visual Studio吗?

来自分类Dev

我可以一直使用`||`来分配默认参数值吗?

来自分类Dev

YouTube会不会一直使用我的蓝牙扬声器?

来自分类Dev

当我想使用 phantomjs 时,Selenium 一直打开 Firefox 浏览器

来自分类Dev

当我使用 http post 时,angular js 一直显示未定义的值

来自分类Dev

我的IDE一直崩溃,我该如何诊断?

来自分类Dev

我如何一直创建Android服务

来自分类Dev

穆特一直给我不确定

来自分类Dev

批处理goto一直给我相同的输出?

来自分类Dev

我一直遇到无法修复的细分错误

来自分类Dev

我的电脑一直死机。会是什么呢?

来自分类Dev

Windows 10关机后一直重启我的电脑

来自分类Dev

我的功能一直在给NaN

来自分类Dev

数学方法一直给我相同的数字

Related 相关文章

  1. 1

    我一直在使用Eclipse安装Android的Crashlytics

  2. 2

    我应该一直使用NSAsynchronousFetchRequest而不是NSFetchRequest吗?

  3. 3

    我一直在使用的理解和excel公式

  4. 4

    我的docker build一直关闭

  5. 5

    我的硬盘一直在旋转

  6. 6

    我的ID一直返回null

  7. 7

    我一直未定义

  8. 8

    一直使用Laravel Eloquent吗?

  9. 9

    端口 TCP 一直在使用

  10. 10

    即使没有红线,Java 也一直给我一个错误

  11. 11

    我一直在获取java.io.NotSerializableException:java.io.ObjectOutputStream

  12. 12

    我是 firebase 的新手,但一直在使用 java 脚本,但我不明白 snap => 的作用以及为什么使用它

  13. 13

    我应该一直使用threading.Thread.join()吗?

  14. 14

    为什么我不应该一直使用ICollection而不是IEnumerable?

  15. 15

    我可以一直使用findNavController(mView)在Android Studio 3.5.2中找到NavController吗?

  16. 16

    我需要一直保持在线状态才能使用Visual Studio吗?

  17. 17

    我可以一直使用`||`来分配默认参数值吗?

  18. 18

    YouTube会不会一直使用我的蓝牙扬声器?

  19. 19

    当我想使用 phantomjs 时,Selenium 一直打开 Firefox 浏览器

  20. 20

    当我使用 http post 时,angular js 一直显示未定义的值

  21. 21

    我的IDE一直崩溃,我该如何诊断?

  22. 22

    我如何一直创建Android服务

  23. 23

    穆特一直给我不确定

  24. 24

    批处理goto一直给我相同的输出?

  25. 25

    我一直遇到无法修复的细分错误

  26. 26

    我的电脑一直死机。会是什么呢?

  27. 27

    Windows 10关机后一直重启我的电脑

  28. 28

    我的功能一直在给NaN

  29. 29

    数学方法一直给我相同的数字

热门标签

归档