【问题标题】:Scala macros: Generate factory or ctor for Java PojoScala 宏:为 Java Pojo 生成工厂或 ctor
【发布时间】:2016-12-20 15:34:20
【问题描述】:

我目前正在处理相当大的代码库,其中新代码是用 scala 编写的,但仍有许多旧 Java 代码。特别是有很多我们必须讨论的 Java API。旧代码使用带有公共非最终字段的简单 Java Pojo,没有任何方法或构造函数,例如:

public class MyJavaPojo {
    public String myField1;
    public MyOtheJavaPojo myField2;
}

请注意,我们没有为这些类型添加辅助方法或构造函数的选项。这些目前像旧的 c-structs(预先命名的参数)一样创建,如下所示:

val myPojo = new MyJavaPojo
myPojo.myField1 = ...
myPojo.myField2 = ...

因此,很容易忘记分配其中一个字段,尤其是当我们突然向 MyJavaPojo 类添加新字段时,编译器不会抱怨我留下了一个字段空值。

注意:我们没有以正常方式修改 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 = ...)

注意/重要提示:命名参数!

我正在寻找一种即用型解决方案或关于我可以在哪里阅读有关制作解决方案的提示。

感谢所有想法和意见!

【问题讨论】:

    标签: scala scala-macros


    【解决方案1】:

    看看scala-beanutils

    @beanCompanion[MyJavaPojo] object MyScalaPojo
    
    MyScalaPojo(...)
    

    它可能不会直接工作,因为你的类不是 bean,它只是为 Scala 2.10 制作的,但源代码不到 200 行,应该让你知道从哪里开始。

    【讨论】:

    • 很酷的项目。谢谢。
    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    相关资源
    最近更新 更多