Scala 宏:为 Java Pojo 生成工厂或构造函数
Scala macros: Generate factory or ctor for Java Pojo
我目前正在使用相当大的代码库,其中新代码是用 scala 编写的,但仍然有很多旧的 Java 代码。特别是有很多 java API 我们必须与之交谈。旧代码使用带有 public 非最终字段的简单 Java Pojos, 没有任何方法或构造函数 ,例如:
public class MyJavaPojo {
public String myField1;
public MyOtheJavaPojo myField2;
}
请注意,我们没有向这些类型添加辅助方法或构造函数的选项。这些目前是像这样的旧 c 结构(预先命名的参数)创建的:
val myPojo = new MyJavaPojo
myPojo.myField1 = ...
myPojo.myField2 = ...
因此,很容易忘记分配其中一个字段,尤其是当我们突然向 MyJavaPojo 添加新字段时class,编译器不会抱怨我将一个字段留为空。
注意:我们没有以正常方式修改 java types/adding 构造函数的选项。我们也不想开始创建大量手动创建的辅助函数来创建对象——我们真的很想找到一个基于 scala 宏的解决方案而不是可能的!
我想做的是创建一个宏,为我的 Pojos 生成类似构造函数的方法,或者创建一个允许命名参数的工厂的宏。 (基本上让宏完成工作,而不是在 scala 中创建大量手动编写的辅助方法)。
你知道用 Scala 宏做这个的方法吗? (我确定这是可能的,但我这辈子从来没有写过 scala 宏)
需要API备选方案1:
val myPojo = someMacro[MyJavaPojo](myField1 = ..., myField2 = ...)
需要 API 备选方案 2
val factory = someMacro[MyJavaPojo]
val myPojo = factory.apply(myField1 = ..., myField2 = ...)
NOTE/Important: 命名参数!
我正在寻找现成的解决方案或关于我可以在哪里阅读制作解决方案的提示。
感谢所有想法和意见!
@beanCompanion[MyJavaPojo] object MyScalaPojo
MyScalaPojo(...)
它可能不会直接工作,因为你 类 不是 beans,它只是为 Scala 2.10 制作的,但源代码少于 200 行,应该让你知道从哪里开始.
我目前正在使用相当大的代码库,其中新代码是用 scala 编写的,但仍然有很多旧的 Java 代码。特别是有很多 java API 我们必须与之交谈。旧代码使用带有 public 非最终字段的简单 Java Pojos, 没有任何方法或构造函数 ,例如:
public class MyJavaPojo {
public String myField1;
public MyOtheJavaPojo myField2;
}
请注意,我们没有向这些类型添加辅助方法或构造函数的选项。这些目前是像这样的旧 c 结构(预先命名的参数)创建的:
val myPojo = new MyJavaPojo
myPojo.myField1 = ...
myPojo.myField2 = ...
因此,很容易忘记分配其中一个字段,尤其是当我们突然向 MyJavaPojo 添加新字段时class,编译器不会抱怨我将一个字段留为空。
注意:我们没有以正常方式修改 java types/adding 构造函数的选项。我们也不想开始创建大量手动创建的辅助函数来创建对象——我们真的很想找到一个基于 scala 宏的解决方案而不是可能的!
我想做的是创建一个宏,为我的 Pojos 生成类似构造函数的方法,或者创建一个允许命名参数的工厂的宏。 (基本上让宏完成工作,而不是在 scala 中创建大量手动编写的辅助方法)。
你知道用 Scala 宏做这个的方法吗? (我确定这是可能的,但我这辈子从来没有写过 scala 宏)
需要API备选方案1:
val myPojo = someMacro[MyJavaPojo](myField1 = ..., myField2 = ...)
需要 API 备选方案 2
val factory = someMacro[MyJavaPojo]
val myPojo = factory.apply(myField1 = ..., myField2 = ...)
NOTE/Important: 命名参数!
我正在寻找现成的解决方案或关于我可以在哪里阅读制作解决方案的提示。
感谢所有想法和意见!
@beanCompanion[MyJavaPojo] object MyScalaPojo
MyScalaPojo(...)
它可能不会直接工作,因为你 类 不是 beans,它只是为 Scala 2.10 制作的,但源代码少于 200 行,应该让你知道从哪里开始.