Можно ли делать такие вещи, как mixin, псевдоним (в рубине) в Java?

1

У меня есть исходный код проекта, разработанного другой группой парней. Дело в том, что мне нужно внести некоторые изменения в него, желательно не касаться исходного исходного файла.

В рубине в большинстве случаев должно быть достаточно использовать mixin & alias (alias_method_chain). Но можно ли сделать то же самое в Java?

Или я просто смотрю на это неправильно? Причина попытки не касаться исходного исходного файла заключается в том, что сам проект все еще находится в разработке, поэтому время от времени появятся новые версии, и я бы хотел избежать работы слияния/исправления каждый раз, когда приходит новая версия. Другая причина заключается в том, что помимо исходного кода мне также необходимо изменить некоторые файлы конфигурации. Таким образом, идея состоит в том, чтобы позволить исходной программе загружать файл конфигурации сам, тогда мой удар и загрузить мои собственные вещи. В рубине такие вещи прекрасно обрабатываются alias_method_chain, но на Java я не знаю, как это сделать.

Изменение: работа над AspectJ прямо сейчас, похоже, что она должна работать

PS: Как вы, ребята, живете с затмением? Загрузка плагина очень медленная. Потребовал мне полчаса, чтобы установить плагин m2e !!!

Теги:

1 ответ

0

В настоящее время Java не поддерживает конструкции mixin или alias_method_chain. Если вы хотите "импортировать" или использовать код, не взаимодействуя с ним, вы можете расширить его или использовать шаблон делегирования.

Пример Mixin с шаблоном делегирования:

Скажем, у вас есть 2 интерфейса:

InChargeOfEcology

public interface InChargeOfEcology {
    public boolean checkKyotoProtocolConformity();
}

InChargeOfEconomy

public interface InChargeOfEconomy {
    public boolean checkTreasureBalanceIsPositive();
}

Эти интерфейсы реализуются известными классами:

MinisterOfEcology

public class MinisterOfEcology implements InChargeOfEcology {
    @Override
    public boolean checkKyotoProtocolConformity() {
        System.out.println("Doing the kyoto checks");
        return true;
    }
}

MinisterOfEconomy

public class MinisterOfEconomy implements InChargeOfEconomy {
    @Override
    public boolean checkTreasureBalanceIsPositive() {
        System.out.println("Doing the bank checks");
        return true;
    }
}

Теперь вы хотите микшировать их, чтобы сформировать единую реализацию:

Премьер-министр

public class PrimeMinister implements InChargeOfEcology, InChargeOfEconomy {
    private InChargeOfEcology ecologyDelegate;
    private InChargeOfEconomy economyDelegate;

    public PrimeMinister() {
        ecologyDelegate = new MinisterOfEcology();
        economyDelegate = new MinisterOfEconomy();
    }

    @Override
    public boolean checkKyotoProtocolConformity() {
        return ecologyDelegate.checkKyotoProtocolConformity();
    }

    @Override
    public boolean checkTreasureBalanceIsPositive() {
        return economyDelegate.checkTreasureBalanceIsPositive();
    }
}

Это может показаться тяжелым, когда вы привыкли к более легким конструкциям, но Java их не поддерживает.

alias_method_chain (украшение) пример с шаблоном делегирования:

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

Возьмите приведенный выше пример и добавьте код до или после вызова делегата:

public class PrimeMinister implements InChargeOfEcology, InChargeOfEconomy {
    private InChargeOfEcology ecologyDelegate;
    private InChargeOfEconomy economyDelegate;

    public PrimeMinister() {
        ecologyDelegate = new MinisterOfEcology();
        economyDelegate = new MinisterOfEconomy();
    }

    @Override
    public boolean checkKyotoProtocolConformity() {
        System.out.println("Ensure kyoto protocol is still in use");
        return ecologyDelegate.checkKyotoProtocolConformity();
    }

    @Override
    public boolean checkTreasureBalanceIsPositive() {
        boolean check = economyDelegate.checkTreasureBalanceIsPositive();
        System.out.println("Compare with the last check result");
        return check;
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню