2010-12-01 27 views
2

On m'a posé cette question dans mon interview comment faire une classe qui ne permet que la création de 3 objets.Comment faire classe pour permettre la création de 3 objets seulement

J'ai suggéré de prendre une variable statique et une fonction statique pour la création de l'objet et en retournant la référence du nouvel objet juste vérifier la valeur dans la variable statique pour vérifier le nombre de non. d'objet déjà créé. Deuxième approche je lui ai dit de prendre 3 objets statiques de même classe dans cette classe seulement et laisser l'utilisateur utiliser seulement ces objets.

s'il vous plaît dites-moi la meilleure approche pour effectuer l'opération ci-dessus.

Merci

+0

où vous avez été interviewé? EXFO – TalentTuner

+0

Je ne voudrais pas travailler pour une entreprise qui pense que c'est une bonne question d'entrevue. Je m'enfuirais en hurlant, vraiment. –

+0

@Karl - Une question d'entrevue n'est pas nécessairement indicative des pratiques de programmation. Je pense que votre commentaire est une réaction excessive massive. –

Répondre

3

Je pense que votre première approche est plus proche de la question: faire constructeur privé et une méthode newInstance() statique qui vérifie le nombre de cas ont été créés avant et retourne null si elle est plus que 3.

deuxième approche est également ok, cependant.

EDIT @Saurabh: même si la question ne dit rien sur ce qu'il faut faire dans le cas où l'objet est gc-ed, Développons ceci:

  1. Une bidouille à la première solution: remplacer finalize() méthode cela décrémente le compteur statique des objets.
  2. Un pool d'objets avec un mécanisme de verrouillage qui ne permet à trois utilisateurs, disons utilisateurs, d'utiliser les objets en même temps.
+0

Que se passe-t-il si l'un des objets collectés est – TalentTuner

+0

Est-ce que l'un des objets est GCed? La question est de savoir comment tous les 3 doivent être créés, pas s'assurer que seulement 3 existent à un moment donné. – Gabe

+0

@Saurabh - Semble très improbable tant qu'il y a une référence statique à eux. –

0

Le motif de conception singleton avec quelques modifications deux prend en charge trois instances au lieu d'une.

3

En Java, la solution la plus simple serait d'utiliser une énumération.

0

Quelque chose comme ça ... modèle Singleton simple ... Vous pouvez ajouter un accès direct pour les trois instances via Getters.

import java.util.ArrayList; 
import java.util.Collections; 

public class ThreeInstanceClazz { 

    private static ArrayList<ThreeInstanceClazz> instances= null; 

    private ThreeInstanceClazz(){ 
     // Only a private constructor!! 
    } 

    public static ThreeInstanceClazz getInstance(){ 
     if(instances == null){ 
      instances = new ArrayList<ThreeInstanceClazz>(3); 
     } 

     if(instances.size() < 3){ 
      ThreeInstanceClazz newOne = new ThreeInstanceClazz(); 
      instances.add(new ThreeInstanceClazz()); 

      // return newly created 
      return newOne; 
     }else{ 
      // return random instance ... or anything else 
      Collections.shuffle(instances); 
      return instances.get(0); 
     } 
    } 
} 
1

ma mise en œuvre est serait comme ci-dessous, il est pas parfait, mais mes pensées au départ

public class ThreeInstances 
{ 

    private static int TOTALINSTANCECOUNT = 0; 

    private ThreeInstances() 
    { 
    } 

    private object objLock = new object(); 

    private static List<ThreeInstances> objThreeInstances = new List<ThreeInstances>(); 

    public static ThreeInstances GetInstance() 
    { 

     if (TOTALINSTANCECOUNT < 3) 
     { 
      lock (objLock) 
      { 
       objThreeInstances.Add(new ThreeInstances()); 
       Interlocked.Increment(ref TOTALINSTANCECOUNT); 
       return objThreeInstances[TOTALINSTANCECOUNT]; 

      } 

     } 
     else 
     { 
      Random r = new Random(0); 
      int value = r.Next(2); 
      return objThreeInstances[value]; 
     } 


    } 

    ~ThreeInstances() 
    { 
     Interlocked.Decrement(ref TOTALINSTANCECOUNT); 

     if (TOTALINSTANCECOUNT < 3) 
     { 
      lock (objLock) 
      { 
       objThreeInstances.Add(new ThreeInstances()); 
       Interlocked.Increment(ref TOTALINSTANCECOUNT); 
       return objThreeInstances[TOTALINSTANCECOUNT]; 

      } 

     } 
    } 
} 
+0

interview était à Delhi –

2

La première étape serait d'écrire votre propre machine virtuelle. La réflexion pourrait être utilisée pour contourner la plupart des réponses ici, un classloader personnalisé les battrait tous. Morale de l'histoire: un code suffisamment privilégié peut faire ce qu'il veut à vos cours.

+0

+1: pour le bit de réflexion, je savais de quoi vous parlez, tout simplement Singleton Pattern peut être brisé avec réflexion et je sais que parfois vous avez juste besoin de répondez à ce qui est demandé. – TalentTuner

0

Vérifiez la réponse de Noldorin dans le fil this. Cela pourrait être utile.

0
public class Threeobject 
{ 
    public static int objectcount { get; set; } 

    public Threeobject() 
    { 
     if (Threeobject.objectcount >= 3) 
     { 
      throw new Exception("You cannot create more then three object"); 
     } 
     Threeobject.objectcount++; 
    } 
}