我有一个看起来像这样的课程:
class A {
public void method1(){
iniCall();
// Do something
finalCall();
}
public void method2(){
iniCall();
// Do something different
finalCall();
} // ... more methods like this
}
Run Code Online (Sandbox Code Playgroud)
如何简化这一点iniCall
,finalCall
以便不在每个函数(或多个函数)中编写它们?
是否有可能做类似的call(method1)
事情,如下所示:
public void call(method){
iniCall();
method();
finalCall();
}
Run Code Online (Sandbox Code Playgroud)
否则,什么是好的选择?
Yur*_*rov 12
编辑 我看到我的回答提出了一些问题.
Runnable接口应该由任何其实例要由线程执行的类实现.
因此,创建此接口的实例可能会导致不确定性和问题.正如评论中所建议的那样,您可能希望编写自己的界面并使用它.它可能是这样的:
public interface Method {
public void run();
}
Run Code Online (Sandbox Code Playgroud)
您的call
方法将更改为以下内容:
public void call(Method method) {
iniCall();
method.run();
finalCall();
}
Run Code Online (Sandbox Code Playgroud)
你对这个方法的调用将是这样的:
call(new Method() {
public void run() {
// do your stuff here
}
});
Run Code Online (Sandbox Code Playgroud)
我建议你使用类似的设计或考虑使用模板模式,这可能需要一些重构.
Era*_*ran 12
您可以使用lambda表达式(Runnable
如果不使用Java 8 ,则使用实现的匿名类实例):
public void call(Runnable method){
iniCall();
method.run();
finalCall();
}
...
public void someMethod () {
call (() -> {
// do something
});
...
call (() -> {
// do something different
});
}
Run Code Online (Sandbox Code Playgroud)
类似于其他建议(谁比我快得多 - 但我总是希望提供一个运行示例......),我建议将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");
}
}
Run Code Online (Sandbox Code Playgroud)
根据需要输出:
ini
doSomething
final
ini
doSomethingDifferent
final
Run Code Online (Sandbox Code Playgroud)
BTW:我很犹豫,使用反射一般这样的事情.大多数情况下,有一种更简单,更直接,更不容易出错的方式.
归档时间: |
|
查看次数: |
989 次 |
最近记录: |