如何使类只允许创建3个对象

时间:2010-12-01 07:33:44

标签: c# java oop

在我的采访中我被问到如何创建一个只允许创建3个对象的类。

我建议采用静态变量和静态函数来创建对象,并且在返回新对象的引用时只需检查静态变量中的值以检查no的计数。已经创建的对象。

第二种方法我告诉他只在该类中使用同一类的3个静态对象,并让用户仅使用这些对象。

请告诉我执行上述操作的最佳方法。

由于

8 个答案:

答案 0 :(得分:3)

我认为你的第一种方法更接近于这个问题:make private constructor和一个静态newInstance()方法,用于检查之前创建的实例数,如果超过3则返回null。

然而,第二种方法也没问题。

编辑 @Saurabh:即使问题没有说明如果对象是gc-ed要做什么,让我们开发一下:

  1. 对第一个解决方案的肮脏攻击:覆盖递减对象静态计数器的finalize()方法。
  2. 具有某种锁定机制的对象池,只允许三个用户在同一时间使用这些对象。

答案 1 :(得分:3)

在Java中,最简单的解决方案是使用枚举。

答案 2 :(得分:2)

第一步是编写自己的VM。反思可以用来绕过这里的大部分答案,一个定制的类加载器会打败它们。故事的道德:充分特权的代码可以为你的课程做任何想做的事。

答案 3 :(得分:1)

我的实施将如下所示,它不完美,但我的想法在最初

 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];

             }

         }
     }
}

答案 4 :(得分:0)

单身设计模式经过一些修改,两个支持三个实例而不是一个。

答案 5 :(得分:0)

像这样......简单的Singleton模式......你可以通过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);
        }
    }
}

答案 6 :(得分:0)

this帖子中查看Noldorin的答案。愿这会有所帮助。

答案 7 :(得分: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++;
    }
}