我想重用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();
}
}
在不同的班级很多次。但是中间部分会有所不同。有什么办法吗?
我将从精简的代码版本中举一个例子,这样它就可以在没有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);
}
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句