我在我的采访中被问及如何创建一个只能创建3个对象的课程。如何让课程只允许创建3个对象
我建议采用一个静态变量和一个静态函数来创建对象,并且在返回新对象的引用时只需检查静态变量中的值来检查no的次数。的对象已经创建。
第二种方法我告诉他只在该类中取同一个类的三个静态对象,并让用户只使用那些对象。
请告诉我执行上述操作的最佳方法。
感谢
我在我的采访中被问及如何创建一个只能创建3个对象的课程。如何让课程只允许创建3个对象
我建议采用一个静态变量和一个静态函数来创建对象,并且在返回新对象的引用时只需检查静态变量中的值来检查no的次数。的对象已经创建。
第二种方法我告诉他只在该类中取同一个类的三个静态对象,并让用户只使用那些对象。
请告诉我执行上述操作的最佳方法。
感谢
我想你的第一种方法更接近问题:使私有的构造和检查多少实例之前创建的,如果它返回null静态newInstance()
方法超过3
二但方法也行。
编辑 @Saurabh:即使问题只字未提的情况下做什么的对象是GC-ED,让我们开发这个:
finalize()
方法减少对象的静态计数器。如果收集的物体垃圾之一 – TalentTuner 2010-12-01 07:39:16
单身设计模式一些修改两个支持三个实例而不是一个。
在Java中,最简单的解决方案是使用枚举。
像这样的东西...简单的单例模式...您可以通过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);
}
}
}
我的实现将是如下,它并不完美,但我在最初的
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];
}
}
}
}
步骤思念一个会写自己的VM。反射可以用来绕过这里的大部分答案,一个定制的类加载器会击败所有的答案。故事的道德:有足够特权的代码可以为你的课程做任何事情。
检查Noldorin的回答this线程。这可能会有所帮助。
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++;
}
}
你在哪里接受过采访? EXFO – TalentTuner 2010-12-01 07:36:11
我不想为一家认为这是一个很好的面试问题的公司工作。我真的会逃跑尖叫。 – 2010-12-01 07:38:27
@Karl - 面试问题不一定是编程实践的指示。我认为你的评论是一个巨大的过度反应。 – 2010-12-01 07:48:12