`
cantellow
  • 浏览: 847657 次
  • 性别: Icon_minigender_1
  • 来自: 草帽海贼团
社区版块
存档分类
最新评论

限制类生成的对象数量

    博客分类:
  • Java
阅读更多

类既不可以是private也不可以是protected(内部类除外),所以它只有两种权限:包访问权限或public,如果不希望任何人访问,就把所有的构造器都指定为private,从而阻止任何人都创建对象。有了这一点,你会发现有趣的事情,那就是我们可以掌握创建对象的数量,考虑下面一段代码:

text2.java文件:

package cantellow.text2;

public class text2 
{
final public static int maxNumber = 5;
private static int i;
private int text;
{
   text = 10;
   System.out.println("在执行构造器之前,首先进行非静态字段的初始化:text="+text+"!");
}
static
{
   i = 0;
   System.out.println("第一次访问此类,生成一个CALSS对象,初始化静态成员i!");
}
private text2()
{
   System.out.println("执行构造器!");
}
public static text2 makeText2()
{
   if (i < maxNumber)
   {
    i++;
    return new text2();
   }
   else
   {   
    return null;
   }
}
public int getI()
{
   return i;
}
}
interface Foo {
    public int x=0;
    public void setNumber(int x);
}

 

text1.java文件:

package cantellow.text1;

import cantellow.text2.*;
public class text1 {

/**
* @param args
*/
public static void main(String[] args) 
{
   // TODO Auto-generated method stub  
   while(true)
   {
    text2 otext2 = text2.makeText2();
    if (otext2 == null)
    {
     System.out.println("text2的对象已经达到"+text2.maxNumber+"个了!");
     break;
    }
    else
    {
     System.out.println("已创建text2对象:"+otext2.getI());
    }
   }
}

}

 

可以直接复制运行,运行结果:

第一次访问此类,生成一个CALSS对象,初始化静态成员i!
在执行构造器之前,首先进行非静态字段的初始化:text=10!
执行构造器!
已创建text2对象:1
在执行构造器之前,首先进行非静态字段的初始化:text=10!
执行构造器!
已创建text2对象:2
在执行构造器之前,首先进行非静态字段的初始化:text=10!
执行构造器!
已创建text2对象:3
在执行构造器之前,首先进行非静态字段的初始化:text=10!
执行构造器!
已创建text2对象:4
在执行构造器之前,首先进行非静态字段的初始化:text=10!
执行构造器!
已创建text2对象:5
text2的对象已经达到5个了!

看到没,我们想让它生成几个对象就生成了几个对象,因为创建text2对象只有一种途径,那就是调用makeText2()方法,而我们在调用这个方法创建text2对象之前还做了额外的工作,那就是判断已经创建text2对象的数量是否已经达到一定的数量,如果条件成立就继续创建,否则就返回null。

我们还可以只创建一个对象,考虑下面代码:

 

class Soup
{
private Soup(){}
private static Soup ps1 = new Soup();
public static Soup access()
{
   return ps1;
}
}

 

当我们访问Soup的静态方法Soup.access()时:Soup pri3 = Soup.access();Soup类就开始被加载,加载之后就开始初始化静态字段:private static Soup ps1 = new Soup();在这个过程中,并没有创建Soup对象,它只是返回了一个静态的对象ps1,而在这之后,无论用什么方法都不可能再创建另外一个Soup类对象,除非修改底层代码。

分享到:
评论
1 楼 C_J 2009-11-07  
代码一,我不明白你想表达什么....

有个方式是编译器根本不会让你创建这个类的对象的,你再想想?

代码二,就是23种设计模式的Singleton模式了,这个很常用..
注意:private Soup(){}存在的原因
..

相关推荐

    在.net项目中的实体类生成器

    手动编写每个实体类不仅耗时,而且容易出错,尤其是在字段数量庞大的情况下。为了解决这一问题,开发者们经常使用代码生成工具,如本案例中的"在.net项目中的实体类生成器"。这个工具能够自动化创建带注释的实体类,...

    VB.NET Guid生成器

    在VB.NET编程环境中,Guid(全局唯一标识符)是一种用于创建独特标识的128位数值,常用于数据库记录、对象实例或者网络通信中的唯一识别。Guid生成器是专门用于生成这种唯一标识的工具。本项目提供的“VB.NET Guid...

    EasyModels 测试版2(读数据库自动生成C#和JAVA类文件)

    生成的实体类通常包含字段属性,与数据库表中的列一一对应,同时还可能包含一些基本的getter和setter方法,方便进行对象的操作和数据的存取。 C#和Java作为两种广泛使用的编程语言,它们的实体类生成是该工具的重点...

    正弦波数据生成器

    5. **数据长度**:用户可以决定生成的正弦波数据序列的长度,这可能是固定数量的样本点或持续一定的时间。 6. **输出格式**:生成的正弦波数据可以导出为不同的文件格式,如CSV、MAT或二进制文件,以便于在其他软件...

    DespawningSpawners:限制生成器在其生命周期内可以执行的生成数量

    3. **优化性能**:通过限制生成数量,减少服务器的计算负担,从而提高游戏的运行效率。 4. **动态调整**:可能允许开发者或游戏管理员动态地调整生成器的生成限制,根据服务器负载或游戏活动进行优化。 5. **事件...

    Spire.pdf.zip+++++++ 祛水印 没有数量限制+++++++++++++++++++++ 亲测可用

    "没有数量限制"的描述表明,无论处理多少个PDF文件,这个解决方案都能有效运作,且不受文件数量约束。"亲测可用"则证实了这个方法已经被验证过,可以成功地在实际操作中应用。 关于"Spire.pdf",这可能是指由E-...

    生成图形验证码的类

    这通常涉及到选择一个字符集(如ASCII或Unicode中的字母、数字),然后使用随机数生成器从中选取一定数量的字符。例如,一个常见的4位数字验证码可能从0000到9999之间随机选择。 2. **图像创建**:验证码的可视化...

    php面向对象全面讲解.doc

    类的设计要考虑其实例化后对象的数量、类的属性和方法,以及对象间的交互方式。 总之,面向对象编程提供了一种模型化的编程方式,使程序更接近现实世界的逻辑,提高了代码的可读性和可维护性。在PHP中,尽管不是纯...

    Unity 道具生成详细步骤及代码

    在实际项目中,你可能还需要考虑更多因素,如道具生成的数量限制、碰撞检测、动画控制等。此外,还可以扩展这个脚本,添加更多的逻辑,比如根据玩家行为动态调整生成频率,或者实现道具的随机属性。 111.html文件...

    delphi 试卷生成系统

    例如,可以设置不同难度级别的试题权重,再根据权重和数量限制进行随机抽取,确保试卷的难度适中且分布均匀。 5. 试卷模板设计 Delphi提供了丰富的控件,如Label、Memo、RadioGroup等,可以方便地创建出各种类型的...

    ConcreteBone1.zip_matlab随机骨料_随机生成骨料_随机骨料_随机骨料生成_骨料

    同时,可能会有特定的条件来限制骨料的重叠,比如通过检查每个新生成的骨料与其他骨料之间的距离。 7. **数据存储和读取**:如果需要保存骨料的属性(如位置、大小等)以便后续分析,可以使用MATLAB的数据存储函数...

    c++如何控制对象的创建方式(禁止创建栈对象or堆对象)和创建的数量

    这样可以限制栈对象的生成,同时也允许使用new来产生堆对象。 例如: ```cpp class NoStackObject{ protected: ~NoStackObject(){}; public: void destroy(){ delete this; } }; ``` 在上面的代码中,将析构函数...

     用于批量生成随机文件名 随机大小 随机内容的文件或文件夹

    例如,在C++中,我们可以使用`fseek`和`fwrite`函数定位并写入数据,Python中则可以使用`io`模块的`BytesIO`对象配合`random`模块生成随机字节流。 再者,“随机内容”则更为复杂。内容可以是纯文本、二进制数据...

    【05-面向对象(下)】

    •静态内部类的对象寄存在外部类里,非静态内部类的对象寄存在外部类实例里 使用内部类 •1.在外部类内部使用内部类-不要在外部类的静态成员中使用非静态内部类,因为静态成员不能访问非静态成 员。 ...

    java生成二维码所需jar及其生成的代码

    - 二维码的内容有限制,根据错误纠正级别不同,最大字符数量会有所变化。 - 二维码的尺寸应适中,过大或过小都可能导致识别困难。 - 错误纠正级别对二维码的容错能力有很大影响,L级别提供最高错误修复能力,但...

    试题自动生成系统(vb类)

    【标题】"试题自动生成系统(vb类)"是一个基于Visual Basic(VB)开发的应用程序,主要用于自动化创建考试试卷。这种系统通常包含了多种功能,旨在提高教育工作者或培训机构准备考试材料的效率。VB是一种面向对象的...

    Gif.js 将多张Jpg图片生成一张Gif图片

    - 考虑到文件大小限制,如果图片数量过多或尺寸过大,可能会导致生成的GIF文件过于庞大,影响用户体验。 综上所述,Gif.js 提供了一个强大且灵活的前端解决方案,用于在浏览器环境中生成动态GIF,结合Ajax技术,还...

    Vue+Element实现动态生成新表单并添加验证功能

    v-for指令基于一个数组生成对应数量的DOM结构,这意味着可以预先设置一个基本的表单模板,然后通过数组来控制模板的复制次数,最终实现动态添加表单的需求。 知识点四:表单验证方法 在Vue.js中,Element UI支持了...

    Asp内建对象速查手册

    在实践中,应考虑对象间的协同工作,例如,使用Session和Application对象管理用户状态,结合Request和Response对象实现动态网页生成。同时,理解各种对象的生命周期和局限性,也是优化代码和提升应用性能的关键。

    动态生成文本框

    - 用户体验:为了防止过多的文本框导致页面混乱,可以限制最多生成的文本框数量,或者提供折叠/展开功能。 - 响应式设计:确保动态生成的文本框在不同设备和屏幕尺寸上都有良好的显示效果。 总结,动态生成文本框是...

Global site tag (gtag.js) - Google Analytics