Java.重复使用最终尝试构造
作者:互联网
看下面的代码:
IDfSessionManager manager = DfcSessionManager.getSessionManager();
try {
IDfSession session = manager.getSession(DfsUtils.getCurrentRepository());
...
return somewhat; //May be without return statement
} finally {
if (session != null) {
manager.release(session);
}
}
这样的构造重复很多次并且围绕不同的代码.这可以是带有或不带有return语句的方法.
我想使这个try-finally块可重用.
我已经想到了这样的认识.
public abstract class ISafeExecute<T> {
private IDfSession session = null;
protected abstract T execute() throws DfException;
public T executeSafely() throws Exception {
IDfSessionManager manager = DfcSessionManager.getSessionManager();
try {
session = manager.getSession(DfsUtils.getCurrentRepository());
return execute();
} finally {
if (session != null) {
manager.release(session);
}
}
}
public IDfSession getSession() {
return session;
}
}
会议现场由公众参加.
我们可以像这样使用此类(带有返回的对象):
return new ISafeExecute<String>() {
@Override
public String execute() throws DfException {
return getSession().getLoginTicket();
}
}.executeSafely();
或没有返回对象:
new ISafeExecute() {
@Override
public Object execute() {
someMethod();
return null;
}
}.executeSafely();
解决方法:
您可以使用Runnable< T>建立执行此操作的机制(将一个功能注入另一个功能):
public void runInSession(Runnable<IDfSession> runnable) {
IDfSession session = null;
try {
session = manager.getSession(DfsUtils.getCurrentRepository());
runnable.run(session);
} finally {
if (session != null) {
manager.release(session);
}
}
}
您可以使用更多的泛型来使您也返回值.我在这里缺少Java编译器,但是我不确定语法.
编辑,正如我看到的那样:
使用自定义ISafeExecute接口可能比使用Runnable< T>更为整洁,但是想法仍然相同.您可以构建它,以便可以优雅地放置返回值(或错误):
interface ISafeExecute<T> {
void execute(IDfSession session);
T getResult();
Exception getException();
}
mySafeExecute.execute(session);
if(mySafeExecute.getException() == null) {
return mySafeExecute.getResult();
} else {
// runtime exception or declaration in method
// signature
throw new RuntimeException(mySafeExecute.getException());
}
标签:try-catch,code-reuse,java 来源: https://codeday.me/bug/20191101/1980048.html