Java 一个类只有5个实例
我希望在整个应用程序生命周期中只有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 &
静态
关键字 创建一个名为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);
}
}