我知道之前已经问过这个问题。但我想了解与代码视角的不同之处。
所以这是场景。
我有一个Main.java类。该类调用另一个类Secondary.java。在Secondary类的特定方法中,我希望更新Main类中的一些值。有两种方法可以做到这一点。
1)这样做的一种方法是通过java中的回调函数 2)其次是如果我在Main类中定义静态函数,则从Secondary Class调用静态函数。
以下是我的两种方法。
方法1
接口CallBack.java
public Interface Callback{
public void updateValues();
}
Main.java
public class Main implements Callback {
static int a=1;
public static void main(String args[]) {
Callback callback = new Main();
Secondary obj = new Secondary(callback);
obj.onClick();
}
public void updateValues(){
a = 4;
}
}
Secondary.java
public class Secondary{
private Callback callback;
Secondary (Callback callback) {
this.callback=callback;
}
//On this method click, I want to update values in the Main class
public void onClick(){
callback.updateValues();
}
}
方法2
public class Main {
static int a=1;
public static void main(String args[]) {
Second obj = new Second();
obj.onClick();
}
public static void updateValues(){
a = 4;
}
}
public class Secondary{
Secondary () {
//On this method click, I want to update values in the Main class
public void onClick(){
Main.updateValues();
}
}
所以我只是想知道哪种方法更好?什么时候回调函数真的有用?
注意:这只是一个了解两个概念之间差异的示例。
答案 0 :(得分:3)
哪种方法更好?答案总是取决于背景,有些情况可以打破每一条规则。也就是说,保持耦合低,代码简单和单元测试是常见的优先事项。
static method pros: simple, and direct disadvantages: the static method cannot be substituted with other implementations. callback approach pros: easy to substitute callbacks, good for mocking in tests cons: a little more overhead for the callback (although JVMs can often optimise them out) and a little more conceptual cost to developers; which will be low if they are not abused.
根据您选择的示例判断,我怀疑您正在使用GUI。对于大型应用程序,静态方法方法不会扩展而不会变得脆弱。因此,虽然您的应用程序很小,但您会发现静态方法方法简单而有吸引力。但是,随着应用程序的增长,您向项目中添加了更多人员,他们需要同时对不断增长的代码库进行更改,我们需要分离应用程序的各个部分并对这些部分进行单元测试。这就是回调方法的亮点。
回调方法的危险在于它变得过度使用了。避免尽可能地嵌套回调(功能世界中的模式使这成为一种很棒的技术,但也许是另一篇文章)并且回调必须不知道调用者。循环依赖会使代码以非线性速率复杂化。
答案 1 :(得分:0)
我个人更喜欢你描述的方法2。这让我的原则称为open for extension并关闭以进行修改。
所以明天如果我有一个新的Callback,我可以直接在其中注入并使用updateValue方法。
如果我曾经遵循这个方法,那么这意味着: