我目前正在处理相当大的代码库,其中新代码是用scala编写的,但是仍有许多旧的Java代码。特别是我们需要与很多Java API进行交流。旧代码使用带有公共非最终字段的简单Java Pojos,没有任何方法或构造函数,例如:
public class MyJavaPojo {
public String myField1;
public MyOtheJavaPojo myField2;
}
请注意,我们没有为这些类型添加辅助方法或构造函数的选项。这些目前创建的像旧的c-structs(预先命名的参数),如下所示:
val myPojo = new MyJavaPojo
myPojo.myField1 = ...
myPojo.myField2 = ...
因此,很容易忘记分配其中一个字段,特别是当我们突然向MyJavaPojo类添加新字段时,编译器不会抱怨我&#39 ; ve将一个字段留空。
注意:我们没有选择以正常方式修改java类型/添加构造函数。我们也不想开始为对象创建创建大量手动创建的辅助函数 - 我们真的希望找到一个基于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 = ...)
注意/重要:命名参数!
我正在寻找一个现成的解决方案或提示我可以在哪里阅读。
赞赏所有想法和意见!
答案 0 :(得分:1)
@beanCompanion[MyJavaPojo] object MyScalaPojo
MyScalaPojo(...)
它可能无法直接工作,因为您的类不是bean而且它仅用于Scala 2.10,但源代码是< 200行,应该让你知道从哪里开始。