2010-07-25 205 views
0

当我们只想创建一个类的对象时,我们使用单例设计模式。我想创建我的课程的最多3或5个对象。有什么办法来限制Java中最大的对象创建次数吗?Java创建一个类的最多3个对象

+0

你想创建3(或5)个相同(即可互换)的对象,或者它们应具有不同的特征(即,字段值)? – 2010-07-26 10:54:24

+0

清除http://stackoverflow.com/questions/3164379/only-5-instances-of-a-class的副本,请参阅我接受的解决方案的答案 – GHad 2010-09-17 08:55:11

回答

6

当然,你可以很容易地实现一个类似单例的特性,但是你显然要找的是Object Pool

有这样的水池的许多实现,一个显着的一个apache commons/pool

1

正如seanizer提到你会实现的东西,已经做了,但是,如果你只是有这样的一类,你是担心,加入一个新的jar文件,并用它来进行这样一个微不足道的操作对我来说似乎过度。

一个简单的方法是有一个n(3-5)的数组,并且在“singleton”类中有一个私有构造函数。然后你将有一个instanceOf方法,这是获取对象的唯一方法。

此方法将查看创建的对象的数量是否为<n,如果是,则创建一个新对象并将其返回。

但是,如果所有对象都已经发出,您想要做什么?

当您完成对象时,您需要确保将对象返回到池中,否则您将耗尽对象以分发。

当你发放一个对象时,你可以将它复制到一个集合或数组中,以知道它已经出来,或者,只要有一个布尔n的数组,当对象可用时为true发放。

基本设计很简单,其复杂性在于如何处理可能是错误条件的情况,在您的程序的其余部分。

另外,您需要确保使用finally块返回对象,以便在出现异常时仍然返回该对象。

0

在类中有一个静态字段,用于计算实例已创建的次数。

class Foo { 
    private static Integer num_instances = 0, MAX = 3; 
    public Foo() throws Exception { 
    synchronized(Foo.num_instances) { 
     if(Foo.num_instances > MAX) throw new Exception(); 
     Foo.num_instances++; 
    } 
    } 
} 

编辑:它可能是坏的形式从构造函数抛出一个异常,那么你可以做以下改为:在任何如果您想池(最大NUM内存:

class Foo { 
    private static Integer num_instances = 0, MAX = 3; 
    public Foo try_to_get_a_new_foo() { 
    synchronized(Foo.num_instances) { 
     if(Foo.num_instances > MAX) return null; 
     Foo.num_instances++; 
     return new Foo(); 
    } 
    } 
} 

EDIT 2给定的时间),只需要实现的finalize():

class Foo { 
    private static Integer num_instances = 0, MAX = 3; 
    public Foo try_to_get_a_new_foo() { 
    synchronized(Foo.num_instances) { 
     if(Foo.num_instances > MAX) return null; 
     Foo.num_instances++; 
     return new Foo(); 
    } 
    } 
    public void finalize() { 
    synchronized(Foo.num_instances) { 
     Foo.num_instances--; 
    } 
    super.finalize(); 
    } 
} 
+0

此处的问题是,对象可能早已被垃圾收集而计数仍然存在。你需要在内存中保存这些对象来改变它,然后你又有了一个池。 – 2010-07-25 20:40:18

+0

因为您正在更改您在同步代码内进行同步的实例,所以在此处尝试同步Foo.num_instances时是完全错误的。它不会做你认为它的做法。 – Jorn 2010-07-25 20:42:28

+0

@seanizer OP说:“我想创建我的班级最多3或5个对象”,他没有提及有多少内存实例。 @Jorn - Foo.num_instances是静态的,所以我没有改变我正在同步的实例。在说我“完全错误”之前,请提供一个代码示例或一个清晰的解释。 – twolfe18 2010-07-27 13:01:45

0

这里是我的朋友Tripleton,他也许能帮助你,他的表妹昆顿是相当不言自明的:)。

编辑:

糟糕的代码删除,免得有人可能会真正地使用它,显然是笑话是相当不明显:)

+2

这是一个很糟糕的做法。 – someguy 2010-07-25 20:21:29

+0

所以你必须检查所有3个案例才能找到一个开放的插槽,并希望你不会与其他线程进行相同的操作:) – bwawok 2010-07-25 20:37:52

+0

嗯,这是为了开玩笑:) – darri 2010-07-25 21:00:01