2010-09-14 6 views
0
  1. Je suis en train de mettre en œuvre une classe de service qui utilise les services des fournisseurs tiers.
  2. L'utilisateur va interagir avec la classe Service pour obtenir le service du fournisseur de services.

Mon exigence:
Je veux charger la classe de service qu'une seule fois (ou il persister longtemps en mémoire dire 2 h.).
Ma question:
Comment puis-je vérifier que cette classe de service est chargée une seule fois?
Si elle est chargée à chaque fois qu'une demande est faite, y a-t-il un moyen pour qu'elle persiste dans la mémoire?Chargement de la classe une seule fois


Voici le code de ma classe de service

 
package com.example; 
import com.example.spi.Multiplication; 
import java.util.Iterator; 

import java.util.ServiceLoader; 

public class MultiplicationService implements Multiplication{ 

    private static MultiplicationService service; 
    private ServiceLoader loader; 
    public static int no=0; 
    private MultiplicationService() {  
     loader = ServiceLoader.load(Multiplication.class); 
    } 

    public static synchronized MultiplicationService getInstance() { 
     if (service == null) { 
      service = new MultiplicationService(); 
     }   
     return service; 
    } 

    public int getMultiplication(int a,int b){ 
     int result = 0; 

     try { 
      Iterator multiply = loader.iterator(); 
     while (result == 0 && multiply.hasNext()) 
      { 
       Multiplication d = multiply.next(); 
       result = d.getMultiplication(a,b); 
       System.out.println("Result is : "+ result); 
      } 
     } catch (Exception serviceError) { 
      result = 0; 
      serviceError.printStackTrace(); 

     } 
     return result; 
    } 
} 

Merci

Répondre

2

Vous pouvez implémenter le singleton pattern. Une option utilise un ENUM:

public enum Service { 
    INSTANCE; 

    private ThirdPartyService service = new ThirdPartyService(); 

    public ThirdPartyService getService() { 
     return service; 
    } 
} 

Mais ne pas abuser de ce modèle, car il rend difficile à l'unité-tester votre code.

+0

Merci pour la réponse. Est-ce que mon code crée le singleton? – sjain

+0

@sjain: Votre code est déjà un singleton. Un vieil école, mais un Singleton. –

+0

Le code de Bozho est meilleur car il évite les problèmes avec les écritures en panne - http://www.ibm.com/developerworks/java/library/j-dcl.html – Jayan

2

Go pour Spring.
Créer une entrée de bean et la garder singleton [qui est par défaut]
Il créera un objet de cette classe une fois lorsque le contexte est initialisé, il ne touchera pas la classe et votre but sera résolu.

0

Vous pouvez également vérifier OSGi, qui a un modèle de service et prendra soin de tout le chargement de classe pour vous. Vous pouvez également combine it with Spring pour obtenir les avantages des deux mondes.

Questions connexes