Easy-to-write immutable objects
От: A13x США  
Дата: 03.07.13 14:19
Оценка:
Всем привет,

Хочется еще раз попробовать в свободное время какой-нибудь 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.?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.