У меня есть исходный код проекта, разработанного другой группой парней. Дело в том, что мне нужно внести некоторые изменения в него, желательно не касаться исходного исходного файла.
В рубине в большинстве случаев должно быть достаточно использовать mixin & alias (alias_method_chain). Но можно ли сделать то же самое в Java?
Или я просто смотрю на это неправильно? Причина попытки не касаться исходного исходного файла заключается в том, что сам проект все еще находится в разработке, поэтому время от времени появятся новые версии, и я бы хотел избежать работы слияния/исправления каждый раз, когда приходит новая версия. Другая причина заключается в том, что помимо исходного кода мне также необходимо изменить некоторые файлы конфигурации. Таким образом, идея состоит в том, чтобы позволить исходной программе загружать файл конфигурации сам, тогда мой удар и загрузить мои собственные вещи. В рубине такие вещи прекрасно обрабатываются alias_method_chain
, но на Java я не знаю, как это сделать.
Изменение: работа над AspectJ прямо сейчас, похоже, что она должна работать
PS: Как вы, ребята, живете с затмением? Загрузка плагина очень медленная. Потребовал мне полчаса, чтобы установить плагин m2e !!!
В настоящее время Java не поддерживает конструкции mixin или alias_method_chain. Если вы хотите "импортировать" или использовать код, не взаимодействуя с ним, вы можете расширить его или использовать шаблон делегирования.
Скажем, у вас есть 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" сам по себе не может быть полностью реализован, это зависит от того, что вам действительно нужно делать. Если вы хотите украсить метод, то есть: добавьте некоторое поведение до или после его истинного выполнения, вы можете сделать это следующим образом:
Возьмите приведенный выше пример и добавьте код до или после вызова делегата:
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;
}
}