如何重用Java代码块

4正义者

我想重用Java代码块。

这是完整的代码块:

    Session session = HibernateUtil.getSessionFactory().openSession();
    try {
        session.beginTransaction();

        // begin of different part  
        Criteria criteria=session.createCriteria(Table.class);
        if(filters!=null)
            createFilter(criteria, filters, null,null);                 
        long count=(long)criteria.setProjection(Projections.rowCount()).uniqueResult();
        this.setRowCount((int) count);
        // end of different part

        session.getTransaction().commit();
    } catch (HibernateException e) {
        if(session.getTransaction()!=null)
            session.getTransaction().rollback();
        e.printStackTrace();
    } finally {
        session.flush();
        session.close();
    }
}

我需要使用块:

    Session session = HibernateUtil.getSessionFactory().openSession();
    try {
        session.beginTransaction();

        session.getTransaction().commit();
    } catch (HibernateException e) {
        if(session.getTransaction()!=null)
            session.getTransaction().rollback();
        e.printStackTrace();
    } finally {
        session.flush();
        session.close();
    }
}

在不同的班级很多次。但是中间部分会有所不同。有什么办法吗?

罗杰·古斯塔夫森(Roger Gustavsson)

我将从精简的代码版本中举一个例子,这样它就可以在没有Hibernate的情况下工作。

原始代码:

public class MyClass {
    private int rowCount;

    public void doStuff() {
        Object session = new Object();

        try {
            session.getClass();  // represents session.getTransaction();

            // begin of different part
            String s = session.toString();
            System.out.println(s);
            this.setRowCount(5);
            // end of different part

            session.getClass();  // represents commit
        } catch (Exception e) {
            e.printStacktrace();
        } finally {
            System.out.println("Do some cleanup");
        }
    }

    public void setRowCount(int count) {
        rowCount = count;
    }
}

这将在其他地方称为:

MyCLass obj = new MyClass();
obj.doStuff();

现在进行更改。我将使用lambda表达式,并interface使用注释定义一个@FunctionalInterface这是因为apply接口中方法将返回ExceptionJava 8中的标准功能接口不支持该功能。

首先是新界面:

@FunctionalInterface
public interface MyFunction {
    void apply(Object session, MyClass self) throws Exception;
}

现在更改原始代码:

    public void doStuff() {

    public void doStuff(MyFunction func) {

删除标有不同代码的部分,并将其替换为:

    func.apply(session, this);

以及来自的电话:

obj.doStuff();

obj.doStuff((session, self) -> {
    String s = session.toString();
    System.out.println(s);
    self.setRowCount(5);
});

如果没有Java 8选项,请@FunctionalInterface在界面中删除然后doStuff()像这样调用

obj.doStuff(new MyFunction() {
    @Override
    public void apply(Object session, MyClass self) throws Exception {
        String s = session.toString();
        System.out.println(s);
        self.setRowCount(5);
    }
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何重用Java代码块

来自分类Dev

如何重用scala的“ withSession {隐式会话:Session =>”代码块

来自分类Dev

如何重用Groovy中描述相似构建逻辑的代码块?

来自分类Dev

Webmatrix-可重用的块代码?

来自分类Dev

如何重用drawRect代码?

来自分类Dev

如何在Java中注释代码块

来自分类Dev

如何在Java中注释代码块

来自分类Dev

在Java中使用继承时,如何避免重用代码?

来自分类Dev

Android / Java:如何定义代码块并保留无自定义异常的代码块?

来自分类Dev

如何配置代码块?

来自分类Dev

在jinja2中的多个地方重用代码块

来自分类Dev

如何使用Java 8功能简化重试代码块

来自分类Dev

如何在Java中干燥这些代码块?

来自分类Dev

如何注释已经包含/ *注释的整个代码块(Java)?

来自分类Dev

Java代码块的正确约定

来自分类Dev

Java代码块的正确约定

来自分类Dev

重用switch语句中的代码(Java)

来自分类Dev

如何在R函数中重用代码?

来自分类Dev

如何重用javascript代码显示弹出窗口

来自分类Dev

如何在Capybara中重用代码

来自分类Dev

如何重用稍有不同的代码

来自分类Dev

如何使代码在jQuery中可重用?

来自分类Dev

如何在 Android 中重用 Retrofit 代码

来自分类Dev

代码块如何详细、总结?

来自分类Dev

如何查看代码块中的汇编代码?

来自分类Dev

如何在招摇中重用字符串块

来自分类Dev

如何在招摇中重用字符串块

来自分类Dev

如何在 CloudFormation 中创建可重用的块

来自分类Dev

如何在组件模板中重用 HTML 块?