В настоящее время я работаю с достаточно большой базой кода, где новый код написан на 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/Важно: Именованные параметры!
Я ищу либо готовое к использованию решение, либо подсказки о том, где я могу это прочитать.
Все идеи и ввод оценены!
Прохладный проект. Благодарю. – user1892422