заменить использование переменной методом в кодовой модели

Я ищу решение, в котором я могу определить поле в классе и использовать ссылку в этом конкретном классе. Модель кода должна создать метод для создания экземпляра поля и заменить использование поля созданным методом.

Я надеюсь, что кто-нибудь может мне помочь.

необработанный класс

public class MyClass {
    @LazyInit
    CustomClass member;

    public void someMethod() {
        System.out.println(member);
    }
}

Класс после использования codeModel

public class MyClass_ {
    @LazyInit
    CustomClass member;

    public void someMethod() {
        System.out.println(getInstanceOfMember());
    }

    public member getInstanceOfMember() {
        if (member == null)
            member == new CustomClass();

        return member;
    }
}

person alosdev    schedule 16.11.2012    source источник
comment
Что вы пробовали? Прочитайте это. Попробуйте опубликовать код.   -  person durron597    schedule 16.11.2012
comment
Ваш вопрос не очень ясен, не могли бы вы попробовать переформулировать его. Возможно, небольшой пример того, каким будет ввод и каким будет желаемый результат, может прояснить ситуацию.   -  person Jacob Schoen    schedule 16.11.2012
comment
спасибо за подсказку, обновил вопрос с примером кода. :)   -  person alosdev    schedule 16.11.2012


Ответы (1)


Если немного изменить ситуацию, то эта проблема станет гораздо более управляемой. Изменив переменную на абстрактный метод получения, вы можете выполнить ленивую инициализацию в сгенерированном классе, оставив базовый класс в покое. Вот что я имею в виду:

Входной класс:

public abstract class MyClass {
    @LazyInit
    public abstract CustomClass getMember();

    public void someMethod() {
        System.out.println(getMember());
    }
}

Сгенерированный класс:

public class MyClass_ extends MyClass {

    private CustomClass member;

    public synchronized CustomClass getMember() {
        if (member == null){
            member == new CustomClass();
        }
        return member;
    }
}

Затем, чтобы использовать этот сгенерированный класс, вы можете либо создать его экземпляр напрямую, либо использовать утилиту:

new MyClass_().someMethod(); // prints CustomClass.toString() (non-null)

or

Lazy.get(MyClass.class).someMethod() // same

Реализовать это с помощью процессора аннотаций и генератора кода (например, JCodeModel) довольно просто. Дайте мне знать, если вам нужны подробности об этом.

person John Ericksen    schedule 14.07.2014