我有一个看起来像这样的课程:
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(); }
否则,什么是好的选择?
编辑 我看到我的回答提出了一些问题.
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 } });
我建议你使用类似的设计或考虑使用模板模式,这可能需要一些重构.
您可以使用lambda表达式(Runnable
如果不使用Java 8 ,则使用实现的匿名类实例):
public void call(Runnable method){ iniCall(); method.run(); finalCall(); } ... public void someMethod () { call (() -> { // do something }); ... call (() -> { // do something different }); }
类似于其他建议(谁比我快得多 - 但我总是希望提供一个运行示例......),我建议将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:我很犹豫,使用反射一般这样的事情.大多数情况下,有一种更简单,更直接,更不容易出错的方式.