2009-08-14 7 views
2

1. Voilà à quoi ressemble ma classe dao où le code de transaction se répète pour chaque méthode. possible de mettre ce code extrait en super classe de sorte que je ne ai pas besoin de répéter le code ci-dessous tout le temps? tout élaboré comment faire cela?
2.S'il est nécessaire de placer l'extrait dans super.class. La superclasse devrait-elle être statique?write java wrapper

for (int i = 0; i < NUM_RETRIES; i++) { 
    pm.currentTransaction().begin(); 

    <all my code will be here> 

    try { 
     pm.currentTransaction().commit(); 
     break; 

    } catch (JDOCanRetryException ex) { 
     if (i == (NUM_RETRIES - 1)) { 
      throw ex; 
     } 
    } 
} 
+1

Alors laissez-moi obtenir ce droit - vous répéter le même code ** ** dans une boucle plusieurs fois en supposant que la transaction qui a échoué une fois réussira la prochaine fois? Ils ont un nom pour cela: http://www.quotationspage.com/quote/26032.html – ChssPly76

Répondre

1

Aborder que "l'extrait à superclasse" problème, vous pouvez:

Dans votre vente de classe de base:

public abstract Object doTransaction(); 

public abstract Object executeTransaction(some params){ 
for (int i = 0; i < NUM_RETRIES; i++) { 
    pm.currentTransaction().begin(); 

    this.doTransaction(); 

    try { 
     pm.currentTransaction().commit(); 
     break; 

    } catch (JDOCanRetryException ex) { 
     if (i == (NUM_RETRIES - 1)) { 
      throw ex; 
     } 
    } 
} 
} 

Dans votre classe dérivée, redéfinir la méthode doTransaction

public Object doTransaction() { 

//access database and stuff; 
} 

Veuillez ajuster les types de retour et les paramètres en conséquence.

Notez qu'il n'y a rien de statique (méthodes statiques ne peuvent pas être remplacées), sa juste une mise en œuvre du template method pattern.

+0

exemple dans dao, j'ai méthode public Liste getSomething() { // comment appeler doTransaction de la classe de base? } – cometta

+0

si vous devez appeler explicitement la méthode getSOmething() sur votre classe de base (à partir d'une instance dérivée), faites juste super.getSomething() – Tom

+0

tom peut expliquer plus comment je l'ai mis dans dao. mon dao étend la classe de base? – cometta