2016-12-20 12 views
1

В настоящее время я работаю с достаточно большой базой кода, где новый код написан на scala, но там, где осталось много старого кода Java. В частности, есть много API-интерфейсов java, с которыми нам нужно поговорить. Старый код использует простой Java Pojos с общественными неконечное полями, без каких-либо методов или конструкторов, например:Scala macros: Генерировать фабрику или ctor для Java Pojo

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

Обратите внимание, что мы не имеем возможность добавления вспомогательных методов или конструкторов для этих типов. Они в настоящее время созданы как старые с-структур (предварительно названных параметров), как это:

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

Из-за этого, очень легко забыть о присвоении одному из полей, особенно, когда мы вдруг добавлять новые поля к классу MyJavaPojo, компилятор не будет жаловаться, что я оставил одно поле равным null.

ПРИМЕЧАНИЕ. У нас нет возможности модифицировать типы java/add constructors обычным способом. Мы также не хотим начинать создавать множество и много созданных вручную вспомогательных функций для создания объектов. Нам бы очень хотелось найти решение, основанное на макросах scala, а не на возможном!

То, что я хотел бы сделать, было бы создать макрос, который генерирует либо конструктор-подобный метод для моего Pojos, либо макрос, который создает фабрику, позволяющую использовать именованные параметры. (В принципе, позволить макросу выполнять работу вместо создания gazillion вручную написанных вспомогательных методов в scala).

Вы знаете какой-либо способ сделать это с помощью scala-макросов? (Я уверен, что это возможно, но я никогда не писал SCALA макрос в моей жизни)

Желаемая API альтернатива 1:

val myPojo = someMacro[MyJavaPojo](myField1 = ..., myField2 = ...) 

Желаемая API альтернатива 2

val factory = someMacro[MyJavaPojo] 
val myPojo = factory.apply(myField1 = ..., myField2 = ...) 

NOTE/Важно: Именованные параметры!

Я ищу либо готовое к использованию решение, либо подсказки о том, где я могу это прочитать.

Все идеи и ввод оценены!

ответ

1

Посмотрите на scala-beanutils.

@beanCompanion[MyJavaPojo] object MyScalaPojo 

MyScalaPojo(...) 

Это, вероятно, не будет работать напрямую, как вы классы не являются бобы, и это только было сделано для Scala 2.10, но исходный код < 200 строк и должно дать вам представление о том, с чего начать.

+0

Прохладный проект. Благодарю. – user1892422

 Смежные вопросы

  • Нет связанных вопросов^_^