当前位置:  开发笔记 > 编程语言 > 正文

一种方法在几种方法中调用

如何解决《一种方法在几种方法中调用》经验,为你挑选了3个好方法。

我有一个看起来像这样的课程:

class A {
    public void method1(){
        iniCall();

        // Do something
        finalCall();
    }

    public void method2(){
        iniCall();

        // Do something different
        finalCall();
    } // ... more methods like this
}

如何简化这一点iniCall,finalCall以便不在每个函数(或多个函数)中编写它们?

是否有可能做类似的call(method1)事情,如下所示:

public void call(method){
    iniCall();
    method();
    finalCall();
}

否则,什么是好的选择?



1> Yury Fedorov..:

编辑 我看到我的回答提出了一些问题.

Runnable接口应该由任何其实例要由线程执行的类实现.

因此,创建此接口的实例可能会导致不确定性和问题.正如评论中所建议的那样,您可能希望编写自己的界面并使用它.它可能是这样的:

public interface Method {
    public void run();
}

您的call方法将更改为以下内容:

public void call(Method method) {
    iniCall();
    method.run();
    finalCall();
}

你对这个方法的调用将是这样的:

call(new Method() {
    public void run() {
        // do your stuff here
    }
});

我建议你使用类似的设计或考虑使用模板模式,这可能需要一些重构.


@RudiKershaw和Orlangure Runnable可能最初设计用于线程,但这不再是它唯一的用途; 见[Brian Goetz的评论.](http://stackoverflow.com/questions/26504594/functional-callback-in-java-8?lq=1#comment41657813_26504594)
关于编辑的补充:JavaDocs中的建议并不意味着每个runnable都应该在自己的线程中执行!事实上,这肯定不应该在这里完成,因为那时,例如,``finalCall`可能在`// do something`完成之前被调用.
我不会进行投票,但我很抱歉 - "[Runnable接口应由任何其实例由线程执行的类实现](http://docs.oracle.com/javase/7/docs/ API /爪哇/郎/ Runnable.html)".使用它喜欢这对于将来看它的人来说只是一个错误.声明你自己的类并调用它的方法.Runnable不是为此而设计的.

2> Eran..:

您可以使用lambda表达式(Runnable如果不使用Java 8 ,则使用实现的匿名类实例):

public void call(Runnable method){
    iniCall();
    method.run();
    finalCall();
}

...

public void someMethod () {

    call (() -> {
                   // do something
                });
    ...
    call (() -> {
                   // do something different
                });

}



3> Marco13..:

类似于其他建议(谁比我快得多 - 但我总是希望提供一个运行示例......),我建议将Runnable实例传递给一般调用iniCall(),执行Runnable然后调用的方法finalCall().

实际工作可以作为专用Runnable实例,lambdas或方法引用传递- 后者显示在这里:

public class RepeatedMethodContents
{
    public static void main(String[] args)
    {
        RepeatedMethodContents r = new RepeatedMethodContents();
        r.callWrapped(r::doSomething);
        r.callWrapped(r::doSomethingDifferent);
    }

    private void callWrapped(Runnable runnable)
    {
        iniCall();
        runnable.run();
        finalCall();
    }

    private void doSomething()
    {
        System.out.println("doSomething");
    }

    private void doSomethingDifferent()
    {
        System.out.println("doSomethingDifferent");
    }

    private void iniCall()
    {
        System.out.println("ini");
    }

    private void finalCall()
    {
        System.out.println("final");
    }

}

根据需要输出:

ini
doSomething
final
ini
doSomethingDifferent
final

BTW:我很犹豫,使用反射一般这样的事情.大多数情况下,有一种更简单,更直接,更不容易出错的方式.

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有