在我的采访中我被问到如何创建一个只允许创建3个对象的类。
我建议采用静态变量和静态函数来创建对象,并且在返回新对象的引用时只需检查静态变量中的值以检查no的计数。已经创建的对象。
第二种方法我告诉他只在该类中使用同一类的3个静态对象,并让用户仅使用这些对象。
请告诉我执行上述操作的最佳方法。
由于
答案 0 :(得分:3)
我认为你的第一种方法更接近于这个问题:make private constructor和一个静态newInstance()
方法,用于检查之前创建的实例数,如果超过3则返回null。
然而,第二种方法也没问题。
编辑 @Saurabh:即使问题没有说明如果对象是gc-ed要做什么,让我们开发一下:
finalize()
方法。答案 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++;
}
}