如何保证对象的唯一性

/*
如何保证对象的唯一性:
   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);
	}
}

  

如何保证对象的唯一性

时间: 2024-10-29 20:53:05

如何保证对象的唯一性的相关文章

解说HashSet如何保证元素的唯一性

HashSet底层数据结构是哈希表,哈希表按哈希值来存储,HashSet集合中有若干个存储区域,而每个对象可以计算出一个hash值,系统会自动将这个值分组,对应若干个存储区域.当添加新元素时,系统会计算出这个元素的hash值,然后跟存储区域的每一个元素进行比较,如果不相同则添加该新元素.如果相同再equals比较,若为false,则添加该元素. 简单说就是同过元素的两个方法,hashcode()和equals()来完成,如果元素的hashCode值相同,再判断equals是否为true,若为tr

Java 并发编程(四):如何保证对象的线程安全性

本篇来谈谈 Java 并发编程:如何保证对象的线程安全性. 01.前言 先让我吐一句肺腑之言吧,不说出来会憋出内伤的.<Java 并发编程实战>这本书太特么枯燥了,尽管它被奉为并发编程当中的经典之作,但我还是忍不住.因为第四章"对象的组合"我整整啃了两周的时间,才啃出来点肉丝. 读者朋友们见谅啊.要怪只能怪我自己的学习能力有限,真读不了这种生硬无趣的技术书.但是为了学习,为了进步,为了将来(口号喊得有点大了),只能硬着头皮上. 请随我来,我尽量写得有趣点. 02.线程安全类

HashSet集合是如何保证元素的唯一性的?

HashSet集合的特点是元素无序和不重复 . 首先,HashSet的底层数据结构是哈希表.哈希表就是存储一系列哈希值的表,而哈希值是由对象的hashCode()方法生成的. 确保元素唯一性的两个方法,hashCode()和equals()方法. 当调用add()方法向集合中存入对象的时候,先比较此对象与原有对象的哈希值有没有一样的,如果都不一样就直接存入:如果有与之相同的哈希值,则要继续比较这两个对象是否为同一个对象,此时就要调用对象的equals()方法了. 总之,只有HashCode的至相

C# 如何保证对象线程内唯一:数据槽(CallContext)

如果说,一个对象保证全局唯一,大家肯定会想到一个经典的设计模式:单例模式,如果要使用的对象必须是线程内唯一的呢? 数据槽:CallContext,ok看下msdn对callcontent的解释. CallContext 是类似于方法调用的线程本地存储区的专用集合对象,并提供对每个逻辑执行线程都唯一的数据槽.数据槽不在其他逻辑线程上的调用上下文之间共享.当 CallContext 沿执行代码路径往返传播并且由该路径中的各个对象检查时,可将对象添加到其中. 也就是说,当前线程对对象进行储存到线程本地

HashSet如何保证元素的唯一性-跟踪源码解析

自己的理解:HashSet的底层数据结构用的是哈希表(HashMap),当往HashSet上添加一条元素时. public boolean add(E e) { return map.put(e, PRESENT)==null;//PRESENT是一个一样的Object对象,调用HashMap的put方法 } 点进put方法如下: public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold);

集合练习 练习:每一个学生Student都有一个对应的归属地定义为String类型。学生属性:姓名,年龄 注意:姓名和年龄相同的视为同一个学生。保证学生的唯一性。 1、描述学生。 2、定义Map容器,将学生作为键,地址作为值存入集合中。 3、获取Map中的元素并进行排序。

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 22.0px Monaco } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 22.0px Monaco; min-height: 30.0px } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 22.0px Monaco; color: #931a68 } p.p4 { margin: 0.0px 0.0px 0

python locust 性能测试:locust参数-保证并发测试数据唯一性,循环取数据

from locust import TaskSet, task, HttpLocustimport queue class UserBehavior(TaskSet): @task def test_register(self): try: # get_nowait() 取不到数据直接崩溃:get() 取不到数据会一直等待 data = self.locust.user_data_queue.get_nowait() # 取值顺序 'username': 'test0000'.'usernam

python locust 性能测试:locsut参数化-保证并发测试数据唯一性,不循环取数据

from locust import TaskSet, task, HttpLocustimport queue class UserBehavior(TaskSet): @task def test_register(self): try: # get_nowait() 取不到数据直接崩溃:get() 取不到数据会一直等待 data = self.locust.user_data_queue.get_nowait() # 取值顺序 'username': 'test0000'.'usernam

Objective-C(iOS)严格单例模式正确实现

注:本文所有权归作者所有,转载请注明出处 当希望在一个应用程序中某个类的对象只能存在一个的时候就可以考虑用单例模式来实现,单例模式在C++中比较容易实现(只需把构造函数声明为private),而在Objective-C中对象可以通过NSObject的alloc来产生,所以需要编写一些额外的代码来确保对象的唯一性,考虑到现在编写iOS APP代码几乎都是ARC方式,且GCD也已经被用烂了,故本文给出一种利用GCD技术来实现严格单例模式的ARC版本,具体代码如下所示,所有的注意点都写在了注释里面: