Автогенерация объектов значения - PullRequest
3 голосов
/ 14 апреля 2009

С учетом интерфейса или интерфейсов, каков наилучший способ создания реализации класса?

interface Vehicle
{
    Engine getEngine();
}

@Generated
class Car implements Vehicle
{
    private final Engine engine;

    public Car(Engine engine)
    {
        this.engine = engine;
    }

    public Engine getEngine()
    {
        return engine;
    }

    // generated implementation of equals, hashCode, toString, 
}

Переменные класса должны быть получены из методов получения интерфейса. В идеале ковариантные возвращаемые типы в интерфейсах должны обрабатываться. Реализация должна поддерживать неизменяемость, используя закрытые конечные переменные и создание экземпляра конструктора. Должны быть сгенерированы методы equals, hashCode и toString.

Ответы [ 4 ]

3 голосов
/ 14 апреля 2009

Более чистым способом является использование CGLIB для динамической генерации класса во время выполнения. Очевидно, вы не можете просмотреть исходный файл.

Если вам нужен исходный файл, вы можете попробовать codemodel и сделать что-то вроде:

JCodeModel cm = new JCodeModel();
x = cm._class("foo.bar.Car");
x.field(Engine.class, "engine");
for (PropertyDescriptor pd:    Introspector.
              getBeanInfo(Vehicle.class).getPropertyDescriptors()) {
    g = x.method(JMod.PUBLIC, cm.VOID, pd.getReaderMethod().getName()); 
    g.body()...
    s = x.method(JMod.PUBLIC, cm.VOID, "set" + pd.getName());
    s.body()...
}
hc = x.method(JMod.PUBLIC, cm.VOID, "hashCode"));
hc.body()...
cm.build(new File("target/generated-sources"));

Или, как предложено ранее, использовать IDE (в Eclipse: Меню «Источник», «Создать хэш-код () и равно () ...», т.е.)

1 голос
/ 14 апреля 2009

Если вы собираетесь делать это очень много, то вы можете рассмотреть возможность использования процессора аннотаций, встроенного в javac (возвращено в Java SE 1.5).

1 голос
/ 14 апреля 2009

Делайте так же, как eclipse, когда реализуете класс для интерфейса.

Если метод начинается с get, считайте его как метод получения и анализируйте метод для извлечения имени переменной и ее типа. Создайте конструктор для этих полей, а также реализуйте методы equals, hashcode и toString.

Вы можете выполнить обычный анализ файла или, возможно, отражение может также помочь, если вы не уверены.

0 голосов
/ 14 апреля 2009

Помимо использования современной Java-IDE, которая поможет вам в стандартном кодировании, вы также можете проверить с помощью динамического прокси

...