首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java中的异常:如何减少重复代码

java中的异常:如何减少重复代码
EN

Stack Overflow用户
提问于 2018-12-19 05:49:41
回答 1查看 433关注 0票数 4

我在Java中使用了数据访问对象( Data Access Object,DAO)模式,并且在我的文件中重复了相同的代码。事情是这样的:

代码语言:javascript
复制
public User getById(int id) throws BDException {
    Session session = sessionFactory.getCurrentSession();
    Transaction tx = session.getTransaction();

    try {
        tx.begin();
        Query query = session.createQuery("SELECT u FROM User u WHERE u.id=:id");
        query.setString("id", id);
        User user = (User) query.uniqueResult();
        tx.commit();

        return user;
    }
    catch(javax.validation.ConstraintViolationException | org.hibernate.exception.ConstraintViolationException cve) {
        try {
            if(tx.getStatus() == TransactionStatus.ACTIVE) {
                tx.rollback();
            }
        }
        catch(Exception exc) {
            LOGGER.error("Error rollback in method='" + getMethodName() + "'");
        }
        throw new BDException(cve);
    }
    catch(RuntimeException ex) {
        try {
            if(tx.getStatus() == TransactionStatus.ACTIVE) {
                tx.rollback();
            }
        }
        catch(Exception exc) {
            LOGGER.error("Error rollback in method='" + getMethodName() + "'");
        }
        throw ex;
    }
    catch(Exception ex) {
        try {
            if(tx.getStatus() == TransactionStatus.ACTIVE) {
                tx.rollback();
            }
        }
        catch(Exception exc) {
            LOGGER.error("Error rollback in method='" + getMethodName() + "'");
        }
        throw new RuntimeException(ex);
    }
}

好吧,我想让你看看捕获物的部分。我在所有的方法中都重复了这一点。如果是简单代码,我可以创建一个方法,将所有代码放在其中并调用该方法,而不是重复代码。问题是,这不是正常的代码,它们是异常。

那么,有没有什么解决方案可以重用代码而不在每个方法中重复(复制-粘贴)代码?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2018-12-19 06:12:21

看起来像是Execute Around idiom的工作。

将专门化代码放在lambda表达式中。将专门化的代码传递给一个具有通用代码的方法,该方法在适当的位置执行包含lambda表达式的对象。

对于您的代码,具体取决于您想要提取的内容,用法可能如下所示:

代码语言:javascript
复制
public User getById(int id) throws BDException {
    return query(
        "SELECT u FROM User u WHERE u.id=:id",
        query -> {
            query.setString("id", id);
            return (User) query.uniqueResult();
        }
    );
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53841603

复制
相关文章

相似问题

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