gpt4 book ai didi

无需继承的 Java 代码重用

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:32:33 25 4
gpt4 key购买 nike

我有 2 个方法调用相同的方法名称:

public void doSomething1(Obj1 obj1) {
obj1.do1();
obj1.do2();
obj1.do3();
}

public void doSomething2(Obj2 obj2) {
obj2.do1();
obj2.do2();
obj2.do3();
}

我想用第三种方法提取到“通用代码”,如果我可以创建一个 Obj1Obj2 的父类(super class),这将是可能的,但我可以't。没有办法让这两个对象继承自父类(super class)。所以我的问题是,当对象之间没有链接时,Java 中是否有一种方法可以进行这种提取,例如:

public void doSomething1(Obj1 obj1) {
refactor(obj1);
}

public void doSomething1(Obj2 obj2) {
refactor(obj2);
}

private void refactor(NewObj newObj) {
newObj.do1();
newObj.do2();
newObj.do3();
}

最佳答案

是的,但它很丑:反射。但在开始之前,让我反驳问题中的一些内容:

使用界面

...this would be possible if I could create a super class of Obj1 and Obj2 but I can't. There is no way make these 2 objects inherit from a super class.

他们不必:他们可以只实现相同的接口(interface),而无需从相同的父类(super class)继承:

public interface TheCommonInterface {
void do1();
void do2();
void do3();
}

public class Obj1 implements TheCommonInterface {
// ...
}

public class Obj2 implements TheCommonInterface {
// ...
}

然后

private void refactor(TheCommonInterface obj) {
obj.do1();
obj.do2();
obj.do3();
}

使用包装器

如果出于某种原因您甚至无法添加接口(interface),请使用实现该接口(interface)的包装类(适配器 类)。

使用反射

在最坏的情况下,您可以使用反射:使用 Class 上的几种机制中的任何一种,让您找到方法(例如 getMethod ),然后使用 Method#invoke关于那个方法:

public void refactor(Object obj) {
Class cls = obj.getClass();
cls.getMethod("do1").invoke(obj);
cls.getMethod("do2").invoke(obj);
cls.getMethod("do3").invoke(obj);
}

那个例子每次都是在重新发现方法。如果您在执行此操作时遇到性能问题,您可能会考虑缓存它们。

关于无需继承的 Java 代码重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39618125/

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