Всем привет,
Хочется еще раз попробовать в свободное время какой-нибудь JVM-совместимый язык, желательно типизированный.
В связи с чем вопрос — в каком из языков (scala, kotlin, jruby, etc) возможно безгеморройное описание immutable объекта с возможностью дальнейшего использования в java коде?
Иными словами хочется буквально следующее — описание объекта в виде:
// псевдокод
package com.myapp.domain
@DTO class Person (long id, String name, int age) {
}
// здесь: аннотация DTO в реальности может быть любой доступной конструкцией языка (макросом, модификатором и т.п.), которая
// обрабатывается компилятором особым образом, генерируя код, который я хочу получить.
что бы
соответствовало эквивалентному описанию на java:
package com.myapp.domain;
public final class Person {
// immutable fields
private final long id;
//...
// generated builder for the hosting class
public static final class Builder {
// mutable fields
private long id;
//...
private Builder() {}
public Person build() {
return new Person(id, ...);
}
public Builder withId(long id) {
this.id = id;
return this;
}
}
public static Builder newBuilder() { return new Builder(); }
public static Builder newBuilder(Person origin) {
return newBuilder()
.withId(origin.getId()).with...;
}
private Person(long id, String name, int age) {
this.id = id;
//...
}
/* Generated getters */
/* Generated hashCode, equals, toString */
}
Иными словами — генерировался бы effectively immutable класс с билдерами, геттерами, equals, hashCode и toString c возможностью использования по имени из явы.
Я так понимаю нужны nemerle-подобные type-aware макросы.
В связи с чем вопрос — можно ли сделать такое на Scala, Kotlin, etc.?