如何保证对象的唯一性

/*
如何保证对象的唯一性:
   1.不允许其他程序用new来创建该类对象。
   2.在该类创建一个本类实例。
   3.对外提供一个方法让其他程序可以获取该对象的引用。
*/
public class Test{
    public static void main(String[] args){
       
	   //Subject sub = Subject.oSub;//这种方法不可控,一般不访问成员
	   Subject sub = Subject.getInstance();//我们可以在方法中增加条件,根据条件是否返回对象的引用,增加程序的可控性!
	   new Student().show(sub);
	   new Teacher().show(sub);
   }
}

class Subject{
    public  String sub;
	public static Subject oSub = new Subject();
	private Subject(){
	    sub = "计算机科学与技术";
	}
	
	public static Subject getInstance(){
	    //oSub = new Subject();
		//if(****) 增加 if 判断 可以 增加程序的可控性
		return oSub;
	}
	
	public String getSubject(){
		return sub;
	}
	
	public void setSubjcet(String name){
	    sub = name;
	}
}

/*
 静态成员变量和普通成员变量的显示初始化的不同之处:
 以下面的例子为例:
 静态变量的显示初始化编译之后不会放进 构造函数中!(想一想啊,如果放进了构造函数中,那不就是产生对象了吗?那可能吗?
      它是静态的,是属于类的!普通成员变量是属于对象的,所以显示初始化会放进构造函数中)所以不会使构造函数一直调用,最终栈溢出
 而普通成员变量的显示初始化编译之后回放进构造函数中, 这样就会导致构造函数一直被反复调用!
 class Subject{
    public  String sub;
	//public Subject ss = new Subject();
	public static Subject oSub = new Subject();//恶汉式
        //public static Subject oSub = null;//懒汉式
	private Subject(){
            //oSub = new Subject();//oSub是静态变量,加上这一句就会导致oSub显示初始化时栈溢出!
	    sub = "计算机科学与技术";
	}
	
	public static Subject getSubject(){        
		return oSub;
                //return oSub = new Subject();
	}
}
*/

class Student{
    public void show(Subject sub){
	    System.out.println(sub.sub);
	}
}

class Teacher{
    public void show(Subject sub){
	    System.out.println(sub.sub);
	}
}

  

原文地址:https://www.cnblogs.com/hujunzheng/p/3872833.html