gpt4 book ai didi

java - 在 Java 中是否可以做 mixin、alias(in ruby​​) 之类的事情?

转载 作者:太空宇宙 更新时间:2023-11-04 14:42:22 28 4
gpt4 key购买 nike

我有另一组人开发的项目的源代码。问题是,我需要对其进行一些修改,最好不要触及原始源文件。

在 ruby​​ 中,在大多数情况下使用 mixin 和 alias(alias_method_chain) 就足够了。但在 Java 中是否可以做同样的事情?

或者我只是以错误的方式看待它?尝试不接触原始源文件的原因是项目本身仍在开发中,因此新版本会不时出现,我想避免每次新版本出现时的合并/修补工作。另一个原因是除了源代码之外,我还需要修改一些配置文件。所以我们的想法是让原始程序自己加载配置文件,然后我的程序启动并加载我自己的东西。在 ruby​​ 中,这些事情可以通过 alias_method_chain 完美处理,但在 Java 中,我不知道该怎么做。

编辑:现在正在使用 AspectJ,看起来应该可以工作

PS:你们如何忍受 eclipse ?下载插件的速度非常慢。我花了半个小时才安装m2e插件!!!

最佳答案

Java 目前不支持 mixin 或 alias_method_chain 构造。如果您想“导入”或使用代码而不与其进行太多交互,您可以扩展它或使用 Delegation Pattern .

使用委托(delegate)模式混合示例:

假设您有 2 个接口(interface):

生态负责人

public interface InChargeOfEcology {
public boolean checkKyotoProtocolConformity();
}

经济主管

public interface InChargeOfEconomy {
public boolean checkTreasureBalanceIsPositive();
}

这些接口(interface)由众所周知的类实现:

生态部长

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

经济部长

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 不支持它们。

具有委托(delegate)模式的alias_method_chain(装饰)示例:

“alias_method_chain”本身无法完全实现,这取决于您真正需要做什么。如果你想装饰一个方法,即:在其真正执行之前或之后添加一些行为,你可以这样做:

以上面的示例为例,在调用委托(delegate)之前或之后添加一些代码:

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;
}
}

关于java - 在 Java 中是否可以做 mixin、alias(in ruby​​) 之类的事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24798853/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com