0

在 Java 中,我创建了一个单例类,如下所示:

public class Singleton 
{   
    private Singleton() { print("Singleton Constructor"); }
    private static Singleton pointer = new Singleton();//static here so only one object 
    public static Singleton makeSingleton()
    {
        return pointer;
    }

    public static void main (String args[]) 
    {
        Singleton nuReference = Singleton.makeSingleton();
        if(nuReference == pointer)
        {
            print("Both are references for same object.");
        }
    }
}

在这里,仅返回对 Singleton 类的已创建对象的引用。如何创建一个类,以便只允许创建该类的四个对象?我可以为此使用这个 Singleton 类,还是必须从头开始?

哦, print() 是我在这里的自定义方法。与 相同System.out.println(),只是击键次数更少 :)

4

8 回答 8

3

那应该工作:

public class Singleton
{
      private Singleton()
      {
            print("Constructor");
      }

      private static Singleton instances[] = new Singleton[4];

      private static Boolean initiated = false;

      public static Singleton getInstance(int index)
      {
          tryInitiate();

          if(instances[index] == null)
          {
              instances[index] = new Singleton();
          }

          return instances[index];
      }

      private static Boolean tryInitiate()
      {
          if(initiated) return false;

          for (int i = 0; i < instances.length; i++)
          {
              instances[i] == null;
          }

          initiated = true;

          return true;
      }
}

除了使用“null”启动对象之外,您还可以在启动期间实例化对象。但是这种方式只有需要的对象被实例化。

于 2013-08-05T16:06:57.507 回答
1

添加静态 int count = numyouwant; 对你的代码来说,每次调用静态创建方法时,将count减1。更重要的是,在调用创建方法中的私有构造函数之前检查count是否为0~

于 2013-08-05T16:00:06.397 回答
1

根据定义,单例只有一个自身实例。你的建议听起来你会更好地利用工厂类型的范例,以及一个计数器/限制器(内置在类中)。

创建一个包含计数器(或存储创建的对象的列表,如果您愿意)和createObject方法的工厂类。在该方法中,确定是否有太多对象的逻辑,因此您可能会限制对象的创建。

这是一个Factory对创建的对象有最大限制的示例。为简单起见,所讨论的对象是一个内部类。

public class Factory {
private final int maxObj = 4;

public class MyObject {
    MyObject() { print("Constructor"); }
}

private List<MyObject> objects = new List<Object>();

// Returns new MyObject if total MyObject 
// count is under maxObj, null otherwise
public MyObject makeObject() {
    if (objects.length() >= maxObj)
        return null;
    MyObject obj = new MyObject();
    objects.add(obj);
    return obj;
}
}
于 2013-08-05T16:00:52.787 回答
0

创建一个变量 x

每次调用 makeSingleton 时增加它的值

如果 x<4 则返回指针

否则返回空

于 2013-08-05T16:00:21.353 回答
0

创建一个字段List<Singleton> mySingletons;和一个字段int singletonCounter=0;

在 makeSingleton() 方法中,如果计数器等于 4,则将 1 添加到计数器返回 null 或返回 4 的单例。如果计数器小于 4,则创建一个单例。

于 2013-08-05T16:00:28.073 回答
0

我的问题是我如何创建一个类,以便说只允许创建该类的 4 个对象。有什么帮助吗?我可以使用这个 Singleton 类还是我必须从头开始?

我相信你想保留一个类的对象池。您不能通过Singleton类来做到这一点,根据定义,它应该返回它拥有的唯一实例。

建议阅读:

  1. Java 中的对象池
  2. 构建自己的对象池
于 2013-08-05T16:01:13.840 回答
0

您可以添加同一对象的 4 个实例的队列,并管理队列/出队操作。

当心:听起来你应该为这些操作应用线程安全。

于 2013-08-05T16:01:46.423 回答
0

我用 Thread Safe 创建了一个

import java.util.ArrayList;
import java.util.List;

public class SingletonLimit{
    
    private List<SingletonLimit> inst_Obj= new ArrayList<>();
    private static final int maxLimit=4;
    
    private SingletonLimit(){
    }
    
    public SingletonLimit getInstance(){
        if(inst_Obj.size()>=maxLimit)
                return null;
        SingletonLimit singleLimit=null;        
        synchronized(SingletonLimit.class){
            singleLimit= new SingletonLimit();
            inst_Obj.add(singleLimit);
        }
        return singleLimit;
    }   
    
}
于 2020-08-16T16:13:07.037 回答