Как используется @Implementation?

Недавно я обнаружил ActiveObejcts, и мне действительно это нравится. Сейчас я использую последнюю версию плагина Atlassian, только net.java.ao часть для ORM. Компилируется и работает нормально. Конечно, я должен сделать несколько тестов производительности, если это соответствует моим требованиям.

Существует аннотация @Implementation. Как это используется? Javadocs очень короткие.

Обновить

Решение:

public class M5 {

public static void main(String[] args) throws SQLException {

        EntityManager m = EntityManagerBuilder
                .url("jdbc:hsqldb:./db/db")
                .username("root")
                .password("")
                .c3po()
                .build();

        m.migrate(Employee.class);

        Employee p = m.create(Employee.class);
        p.setFirstName("Peter");
        p.setLastName("Mmm");
        System.err.println(p.getLastName()); // prints "ln: Mmm"
        p.save();
    }
}

public class Emp {
    private Employee employee;

    public Emp(Employee employee) {
        this.employee = employee;
    }

    public String getLastName() {
        return "ln: " + employee.getLastName();
    }
}

@Implementation(Emp.class)
interface Employee extends Entity {
    String getFirstName();
    void setFirstName(String name);
    String getLastName();
    void setLastName(String name);
}
}

1 ответ

Решение

Active Objects берет ваш интерфейс и через отражение через сложный прокси переводит ваши геттеры, сеттеры и отношения в операторы SQL. Если вы хотите, чтобы часть вашего собственного кода добавляла или изменяла функциональность вашего интерфейса AO, вы можете использовать @Implementation

Пример:

AO интерфейс:

@Implementation(PersonImpl.class)
public interface Person extends Entity {

  String getLastName();
  void setLastName(String name);

  String getFirstName();
  void setFirstName(String name);

  @Ignore
  String getName();
}

Реализация:

public class PersonImpl {

  private final Person person; // this will be the original entity proxy

  public PersonImpl(Person person) {
    this.person = person;
  }

  // "Implement" ignored functions
  public String getName() {
    return String.format("%s %s", this.person.getFirstName(), this.person.getLastName()); 
  }

  // "Enhance" AO getters/setters
  public void setFirstName(String name) {
    this.person.setFirstName("Foobar");
  }
}

Обратите внимание, что АО обращается к этим методам реализации через отражение. Они должны соответствовать именам в интерфейсе. Это может привести к проблемам во время рефакторинга, поскольку имена методов могут измениться, и ваш компилятор не скажет вам, что у вашего соответствующего имени метода impl нет.

Другие вопросы по тегам