使用回调函数和直接在java中调用静态函数有什么区别?

时间:2014-11-08 10:25:58

标签: java callback

我知道之前已经问过这个问题。但我想了解与代码视角的不同之处。

所以这是场景。

我有一个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();
    }

}

所以我只是想知道哪种方法更好?什么时候回调函数真的有用?

注意:这只是一个了解两个概念之间差异的示例。

2 个答案:

答案 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方法。

如果我曾经遵循这个方法,那么这意味着:

  • 我通过使用静态破坏OOP原则。您将无法覆盖静态方法。
  • 如果明天你的updateValue需要改变,你将改变Main,因为修改原则已经关闭
  • 这也将关闭进一步重复使用的大门。
相关问题