如何重用java代码块

时间:2016-03-23 11:17:02

标签: java

我想重用java代码块。

这是完整的代码块:

    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();
    }
}

this.parts

在不同的班级中多次。但中间部分会有所不同。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:1)

以下是使用Runnable作为功能接口的示例。如果你需要传递params,你也可以自己编写。

为了保持清洁,您还可以编写自己的功能界面,因为Runnable通常在涉及线程时使用。

std::vector<S> v(10, S(42));

输出:

public class RunnableExample {

    public static void main(String[] args) {
        RunnableExample example = new RunnableExample();
        example.general(() -> {
            System.out.println("specificA");
        });
        example.general(() -> {
            System.out.println("specificB");
        });
    }

    public void general(Runnable specific) {
        System.out.println("general start");
        specific.run();
        System.out.println("general end");
    }
}

答案 1 :(得分:1)

我将从你的代码的精简版本中做一个例子,这样它就可以在没有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方法将返回Exception。 Java 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);
    }
});

答案 2 :(得分:0)

尝试使用这样的辅助类:

{
    Session session = null;
    try {
        session = DBHelper.getSession();

        // 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

        DBHelper.commit(session);
    } catch (HibernateException e) {
        DBHelper.rollback(session);
        e.printStackTrace();
    } finally {
        DBHelper.close(session);
    }
}

// Helper Class

class DBHelper{
    public static Session getSession() throws HibernateException{   
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        return session;
    }

    public static void rollback(Session session) throws HibernateException{
        if(session.getTransaction()!=null)
            session.getTransaction().rollback();
    }

    public static void commit(Session session) throws HibernateException{
        session.getTransaction().commit();
    }

    public static void close(Session session){
        if(session!=null){
            try{
                session.flush();
                session.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}