Универсальный конструктор (почти) идентичных сторонних классов

#scala #generics #builder

#scala #дженерики #Конструктор

Вопрос:

У меня есть куча сторонних классов, эти классы автоматически генерируются в java и не имеют никакой иерархии

Вот RulesPropertyList

 enum RulesPropertyType {...} class RulesPropertyValue {...}  class RulesProperty {  public RulesPropertyType getPropertyTypeCode(){...}  public RulesPropertyValue getPropertyValue() {...} }  class RulesPropertyList {  public void setNumProperties(int numProperties)  public void setProperties(RulesProperty[] properties) }  

И его Characs* родной брат

 enum CharacsPropertyType {...} class CharacsPropertyValue {...}  class CharacsProperty {  public CharacsPropertyType getPropertyTypeCode(){...}  public CharacsPropertyValue getPropertyValue() {...} }  class CharacsPropertyList {  public void setNumProperties(int numProperties)  public void setProperties(CharacsProperty[] properties) }  

Существует больше, чем просто Rules* Characs* семейства классов, и классы на самом деле имеют больше полей и более глубокие структуры.
Все классы полностью идентичны, за исключением префиксов в именах классов.

В настоящее время у меня есть отдельный метод построения для каждого набора классов.

 def buildRulesPropertyList(props: (RulesPropertyType, RulesPropertValue): RulesPropertyList = {  val properties = props.map { case (type, value) =gt;   RulesProperty(type, value)  }   val propList = RulesPropertyList  propList.setProperties(properties.toArray)  propList.setNumProperties(properties.length)  propList }  

Я должен создать такой конструктор для каждого семейства классов.
Теперь я вижу только возможность создать универсальный конструктор с использованием отражения.

Есть ли в Scala способ создать такого конструктора, используя универсальные шаблоны на языке Scala?

Ответ №1:

Есть ли в Scala способ создать такого конструктора, используя универсальные шаблоны на языке Scala?

да, но я не думаю, что это будет меньше кода. Я думаю, что ваш лучший ход здесь-просто написать несколько простых генераций кода для каждого типа. вы бы скормили ему список фамилий, например, и попросили бы его изложить ваши методы. Seq("Rules", "Characs", ...) build${family}PropertyList

Комментарии:

1. Это вариант, попробую. Спасибо!