首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java语言。使用返回重用try-finally构造

Java语言。使用返回重用try-finally构造
EN

Stack Overflow用户
提问于 2012-08-15 20:53:15
回答 2查看 2K关注 0票数 3

看看这段代码:

代码语言:javascript
复制
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代码块具有可重用性。

我已经想出了这样的认识。

代码语言:javascript
复制
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;
}

}

会话字段是用公共getter创建的。

我们可以像这样使用这个类(带有返回的对象):

代码语言:javascript
复制
return new ISafeExecute<String>() {
        @Override
        public String execute() throws DfException {
            return getSession().getLoginTicket();
        }
    }.executeSafely();

或者没有返回对象:

代码语言:javascript
复制
    new ISafeExecute() {
        @Override
        public Object execute() {
            someMethod();
            return null;
        }
    }.executeSafely();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-15 20:59:21

您可以使用Runnable<T>构建一种机制来实现这一点(某种程度上是将一个函数注入另一个函数):

代码语言:javascript
复制
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>更简洁,但其思想是相同的。您可以构建它,以便可以优雅地放置返回值(或错误):

代码语言:javascript
复制
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());
}
票数 5
EN

Stack Overflow用户

发布于 2012-08-16 16:17:19

我有这样的决定:

代码语言:javascript
复制
 public abstract class SafeExecute<T> {

    protected IDfSession session = null;

    public T executeSafely() throws Exception {
        IDfSessionManager manager = DfcSessionManager.getSessionManager();
        try {
            session = manager.getSession(DfsUtils.getCurrentRepository());
            return logic();
        } finally {
            if (session != null) {
                manager.release(session);
            }
        }
    }

    protected abstract T logic() throws Exception;

}

然后通过扩展这个类:

代码语言:javascript
复制
public class Service extends SafeExecute<String> {

    public String getLoginTicket() throws Exception {
        return executeSafely();
    }

    @Override
    protected String logic() throws Exception {
        //TODO implement
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11969619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档