Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一个类只有5个实例_Java_Singleton - Fatal编程技术网

Java 一个类只有5个实例

Java 一个类只有5个实例,java,singleton,Java,Singleton,我希望在整个应用程序生命周期中只有5个类实例。我怎样才能做到这一点?如果可能,请给出示例代码。查看静态关键字 创建一个名为howMany的静态字段,该字段将在每次调用构造函数时递增 当howMany为=>5时,拒绝创建对象。类示例 class Sample { private static int i = 0; private Sample() { } public static Sample CreateInstance() { if(i &

我希望在整个应用程序生命周期中只有5个类实例。我怎样才能做到这一点?如果可能,请给出示例代码。

查看
静态
关键字

创建一个名为
howMany
的静态字段,该字段将在每次调用构造函数时递增

howMany
为=>5时,拒绝创建对象。

类示例
class Sample
{
   private static int i = 0;

   private Sample()
   {
   } 

  public static Sample CreateInstance()
   {
      if(i <5)
      {
          i++;
          return new Sample();
      } 

      else
        throw new Exception("Can not create more then 5 instance of this class");  
   }

}
{ 私有静态int i=0; 私人样本() { } 公共静态示例CreateInstance() {
如果(i工厂模式可能是您的朋友。一个(虚构的,非线程安全的,因此非常简单)示例来说明该方法:

public static MartiniFactory {

   private static int olives = 100;  // you asked for '5' but 100 is more realistic
                                     // for this example.

   public static Drink createMartini() throws OutOfOlivesException {
     if (olives > 0) {
       olives--;
       return new Martini(new Gin(4), new Vermouth(1), new Olive());
     else {
       throw new OutOfOlivesException();
     }
   }

   // forgot to mention, only the factory (=bar) is able to create Martinis, so:
   private class Martini {
      Martini(Ingredient... ingredients) {
        // ...
      }
      // ....
   }

}
编辑

许可证示例不太好-因此我将其移动到一个域,该域期望工厂创建的对象不会在没有通知工厂的情况下返回和销毁。当没有橄榄油时,酒吧无法创建马提尼酒,而且它肯定不希望饮料在消费完后返回;-)

编辑2 当然,只有工厂才能创建实例(=饮料)。 (不保证添加的内部私有类满足此要求,没有 手头有一个IDE,可以进行快速测试。请随意评论或编辑)

public class-FiveInstance{
私有静态int instanceCount=0;
私人消防(){
}
public static FiveInstance getNewInstance()抛出InstanceExceedexception{
如果(实例计数<5){
instanceCount++;
返回新的FiveInstance();
}否则{
抛出新InstanceExceedexception();
}
}
}

创建一个私有
静态
成员来计算
的实例数。然后,确保类的每个构造函数都递增此
静态
变量并测试溢出。如果您有多个构造函数,我建议您让一个构造函数实现此行为,其他构造函数应该调用它。尝试创建第六个实例时构造函数的行为取决于您。可能您希望抛出一个
异常

,因为应使用枚举创建单例(请参见“有效Java”):


Greetz-GHad

您可以尝试以下代码,但这些代码是用C#编写的,您可以了解如何实现这一点

public  class MultiTone
    {
        private static MultiTone _cache;
        private static int _counter=5;
        MultiTone()
        {

        }
        public static MultiTone GetInstance()
        {
           if(_counter==0)
           {
              return _cache ?? (_cache = new MultiTone());
           }
            _counter--;
            return new MultiTone();
        }
    }

请注意,此类不适用于多线程环境。

我认为您不能。如果有人想要创建或销毁实例,您可以强制使用以下静态方法:

import java.util.*;

public class Fiveton {

    public final static int MAX_INSTANCES = 5;

    private static List<Fiveton> instances = new ArrayList<Fiveton>();


    private Fiveton() { }


    public static Fiveton getInstance() {
        if (instances.size()>=MAX_INSTANCES) throw new RuntimeException("Hey! You've reached the maximum of instances: " + MAX_INSTANCES);
        Fiveton instance = new Fiveton();
        instances.add(instance);
        return instance;
    }

    public static void destroy(Fiveton instance) {
        instances.remove(instance);
    }

}
import java.util.*;
公共五等舱{
公共最终静态int MAX_实例=5;
私有静态列表实例=new ArrayList();
私有Fiveton(){}
公共静态Fiveton getInstance(){
如果(instances.size()>=MAX\u instances)抛出新的RuntimeException(“嘿!您已经达到了实例的最大数量:”+MAX\u instances);
Fiveton实例=新的Fiveton();
实例。添加(实例);
返回实例;
}
公共静态无效销毁(Fiveton实例){
实例。删除(实例);
}
}

问题是方法销毁。您无法确定是否有人仍在引用已销毁的对象。

有一个名为a的模式处理此问题,作为Singleton的扩展。似乎没有人很清楚它本身就是一个模式,或者是Singleton的变体。请查看链接,其中包含示例代码。

请查看s的java实现在Grand中有大量描述

本书概述中的简短描述:

对象池

管理类型对象的重用 创建成本很高的对象 或者只有有限数量的一种 对象可以被创建


如果创建了第六类,您没有指定想要什么。规范不完整是吗?只需调用
new
五次。Simples.Multiton是另一回事。它与创建最大数量的实例无关。我建议再次删除标记。对于那些好奇的人:对于第六类,您需要支付额外的许可费se fee?!?@Andreas\D这只会起作用,所有实例在程序生命周期内都不会被删除。它需要一个完全引用计数的类,这意味着,你还必须关心销毁问题。@InsertNickHere-规范非常模糊。这是一个非常非常简单的代码片段,是一个真正的实现(基于更详细的规范)可能会负责收回或共享资源。+1代码(也许正确)假设您只想调用createMartini()五次。这不是单例样式模式的工作方式。因为单例允许调用尽可能多的次数,并且只在未创建实例时才创建实例(即在第一次调用时)如果您允许此方法被调用五次以上,则需要某种策略来决定返回五个实例中的哪一个。最近使用最少的?循环?随机?将根据具体应用程序确定正确答案。@Noel M-我更改了域。希望我可以保留您的+1;-)@Andreas_D-sure:)我已经编辑了上面的评论。@Amiabh如上所述,这只在实例未被删除的情况下有效。@InsertNickHere-即使实例被删除,也会有效。也许有一个规范真正消耗了资源(如食物)你想在“工厂”缺货后重新启动应用程序。你永远不知道,OP没有告诉你。没有否决,但是:首先,要求用Java语言解决,其次,对于第五个多音接收器来说,工厂将把他的多音视为pu是一个非常特殊的要求,或者是一个巨大的惊喜re Singleton(前四个调用方获得“private”多音)是的,那是在C#中,我提供的代码不是生产代码,而是实现这一点的基本方法。顺便说一句,当我开始发布回复时,有n个
public  class MultiTone
    {
        private static MultiTone _cache;
        private static int _counter=5;
        MultiTone()
        {

        }
        public static MultiTone GetInstance()
        {
           if(_counter==0)
           {
              return _cache ?? (_cache = new MultiTone());
           }
            _counter--;
            return new MultiTone();
        }
    }
import java.util.*;

public class Fiveton {

    public final static int MAX_INSTANCES = 5;

    private static List<Fiveton> instances = new ArrayList<Fiveton>();


    private Fiveton() { }


    public static Fiveton getInstance() {
        if (instances.size()>=MAX_INSTANCES) throw new RuntimeException("Hey! You've reached the maximum of instances: " + MAX_INSTANCES);
        Fiveton instance = new Fiveton();
        instances.add(instance);
        return instance;
    }

    public static void destroy(Fiveton instance) {
        instances.remove(instance);
    }

}