编程语言
首页 > 编程语言> > Java.重复使用最终尝试构造

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