2010-12-01 54 views
2

我在我的采访中被问及如何创建一个只能创建3个对象的课程。如何让课程只允许创建3个对象

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

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

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

感谢

+0

你在哪里接受过采访? EXFO – TalentTuner 2010-12-01 07:36:11

+0

我不想为一家认为这是一个很好的面试问题的公司工作。我真的会逃跑尖叫。 – 2010-12-01 07:38:27

+0

@Karl - 面试问题不一定是编程实践的指示。我认为你的评论是一个巨大的过度反应。 – 2010-12-01 07:48:12

回答

3

我想你的第一种方法更接近问题:使私有的构造和检查多少实例之前创建的,如果它返回null静态newInstance()方法超过3

二但方法也行。

编辑 @Saurabh:即使问题只字未提的情况下做什么的对象是GC-ED,让我们开发这个:

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

如果收集的物体垃圾之一 – TalentTuner 2010-12-01 07:39:16

0

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

3

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

0

像这样的东西...简单的单例模式...您可以通过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

我的实现将是如下,它并不完美,但我在最初的

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

      } 

     } 
    } 
} 
2

步骤思念一个会写自己的VM。反射可以用来绕过这里的大部分答案,一个定制的类加载器会击败所有的答案。故事的道德:有足够特权的代码可以为你的课程做任何事情。

0

检查Noldorin的回答this线程。这可能会有所帮助。

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++; 
    } 
}