限制类生成的对象数量

类既不可以是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类对象,除非修改底层代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值