шаблон метода шаблона
-
16-09-2019 - |
Вопрос
Могу ли я узнать, как создать дочерний класс, если мой метод дочернего класса getInfoFromDB() и saveToDB() должен выполнять другую логику?
public abstract class BaseClass {
public abstract Object doTransaction();
public Object executeTrans() {
//do something
tx.begin();
this.doTransaction();
tx.commit();
}
}
public childClass extends BaseClass{
@Override
public Object doTransaction(){
//overide to get something from database so can only be used for getInfoFromDB() and not for saveToDB()
return something;
}
public List<String> getInfoFromDB(){
super.executeTrans();
}
public void saveToDB(){
super.executeTrans() ;
}
}
Решение
В этом случае вам следует использовать шаблон шаблона, примерно так:
public abstract class BaseClass
{
public Object executeTrans(Template template)
{
tx.begin();
template.doTransaction();
tx.commit();
}
}
public interface Template
{
public void doTransaction();
}
public childClass extends BaseClass
{
public List<String> getInfoFromDB()
{
executeTrans(
new Template()
{
public void doTransaction()
{
...do get info from DB here.
}
}
);
}
public void saveToDB()
{
executeTrans(
new Template()
{
public void doTransaction()
{
...do save to DB here.
}
}
);
}
}
При этом я бы посоветовал использовать классы шаблонов Spring JDBC, а не создавать свои собственные - они были опробованы и протестированы и решили проблемы, с которыми вы можете столкнуться при использовании вложенных транзакций и т. д.
Другие советы
Передайте Runnable, содержащий другую логику, в метод ExecuteTrans().
Однако я не уверен, что шаблон метода шаблона действительно то, что вам здесь нужно (и как он обрабатывает откаты?).Возможно, вы захотите изучить такую структуру, как Spring, которая позволяет декларативные транзакции.
Ник, «Техас», который я собираюсь использовать, выглядит ниже.судя по коду, лучшая практика, жизненный цикл в порядке, поскольку он вызывается как savetodb(), так и getinfofromdb()
public abstract class BaseClass
{
public Object executeTrans(Template template)
{
// PersistenceManager pm = ...;
Transaction tx = pm.currentTransaction();
try {
tx.begin();
template.doTransaction();
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
}
}