我想重用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
在不同的班级中多次。但中间部分会有所不同。有没有办法做到这一点?
答案 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();
}
}
}
}