最近在着手重构一个java UI桌面项目,发现这个项目在一开始的时候由于需求不明确,以及开发人员对swing框架不熟悉等问题造成了页面代码混乱的情况:为了能够在各个类里都可以拿到其他类的引用去进行相应的页面响应操作,在每一个类的构造方法中都传入了主类的引用,在主类中提供了所有类的get()方法,这样的做法显得十分的臃肿,就像这样:

打开主页面后会显示窗体B,窗体B的按钮支持我们打开窗体A,窗体A按钮支持修改B中属性.我们只能通过在主页面的类中使用get(),set()方法来持有A和B的引用,在A和B的构造方法中提供主页面的引用,从而才能做到在B中调用A,A中调用B.但是这样的做法随着项目的开展主页面的类中get()和set()方法的数量将多到你无法想象,那么是否可以提供一个容器,在创建页面时就将该页面对象存入该容器中,其他页面只需通过这个容器来获取其他页面窗体进行操作?

废话不多说我们开始干活,由于不同的页面类型即其类可能不同所以我们提供的容器需要是Object的:

1 public classClassContainerOne {2 private static Map container = new HashMap<>();3

4 public static voidaddClass(String name,Object value){5 container.put(name,value);6 }7 public staticObject getClass(String name){8 returncontainer.get(name);9 }10 }

简单的封装一下我们就可以正常使用,这样的操作,我们只能依靠String来区分对象并且自己来完成强制类型转换:

1 public classTest {2 public static voidmain(String[] args) {3 Teacher teacher = new Teacher("A老师");4 Student student = new Student("B学生");5 ClassContainerOne.addClass("teacher",teacher);6 ClassContainerOne.addClass("student",student);7 Teacher teacher1 = (Teacher) ClassContainerOne.getClass("teacher");8 Student student1 = (Student)ClassContainerOne.getClass("student");9 System.out.println(teacher1 + " " +student1);10 }11 }

我想大家都会想到一个问题,那就是这样的操作安全吗?显然是否定的,一旦我们强制转换错误,那系统就会崩溃,因此我们用泛型来修改完善我们的容器类:

1 public classClassContainerTwo {2 private static Map, Object> container = new HashMap<>();3

4 public static void addClass(ClassvalueType,T value) {5 container.put(valueType, value);6 }7

8 public static T getClass(ClassvalueType) {9 returnvalueType.cast(container.get(valueType));10 }11 }

我们转为使用其Class类型作为key值来对应我们的对象,确实可以做到对象获取时的万无一失:

1 public classTest {2 public static voidmain(String[] args) {3 Teacher teacher = new Teacher("A老师");4 Student student = new Student("B学生");5 ClassContainerTwo.addClass(Teacher.class,teacher);6 ClassContainerTwo.addClass(Student.class,student);7 Teacher teacher1 = ClassContainerTwo.getClass(Teacher.class);8 Student student1 = ClassContainerTwo.getClass(Student.class);9 System.out.println(teacher1 + " " +student1);10 }11 }

但是这样做的代价就是我们无法存放多个相同的对象,我们可以创建一个钩子类来衔接这个类容器和各个对象:

1 public class Key{2 privateString name;3 private ClassvalueType;4

5 public Key(String name, ClassvalueType) {6 this.name =name;7 this.valueType =valueType;8 }9

10 /**

11 * 同时重写equals()和hashCode(),避免加入类容器是和12 * 从类容器中取出对象时实例化的key不是同一个对象,及类属性相同,但是地址不同13 */

14 @Override15 public booleanequals(Object o) {16 if (this == o) return true;17 if (o == null || getClass() != o.getClass()) return false;18 Key> key = (Key>) o;19 return Objects.equals(name, key.name) &&

20 Objects.equals(valueType, key.valueType);21 }22

23 @Override24 public inthashCode() {25 returnObjects.hash(name, valueType);26 }27

28 public ClassgetValueType() {29 returnvalueType;30 }31 }

然后继续完善我们的类容器:

1 public classClassContainerThree {2 private static Map,Object> container = new HashMap<>();3

4 public static void addClass(Keykey,T value) {5 container.put(key, value);6 }7

8 public static T getClass(Keykey) {9 returnkey.getValueType().cast(container.get(key));10 }11 }

这样的封装,虽然对于Key的实例化代码较长,但是很好的解决了我们的类容器存储和获取问题:

1 public classTest {2 public static voidmain(String[] args) {3 Teacher teacher = new Teacher("A老师");4 Student student = new Student("B学生");5 ClassContainerThree.addClass(new Key<>("teacher",Teacher.class),teacher);6 ClassContainerThree.addClass(new Key<>("teacher",Student.class),student);7 Teacher teacher1 = ClassContainerThree.getClass(new Key<>("teacher",Teacher.class));8 Student student1 = ClassContainerThree.getClass(new Key<>("teacher",Student.class));9 System.out.println(teacher1 + " " +student1);10 }11 }

Java存储任意对象_浅析java设计模式(一)----异构容器,可以存储任何对象类型为其他类提供该对象...相关推荐

  1. java 线程组作用_浅析Java中线程组(ThreadGroup类)

    一.概念 Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理.可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线 ...

  2. formdata 接受参数中带有class 对象_浅析JAVA中的反射机制及对Servlet的优化

    今天来聊聊java中的反射机制,工作以后发现很多东西动不动就要使用反射或者动态代理,如果不能很好的理解反射,那么对于动态代理等一些重要的设计模式就会有种不够通透的感觉. 所谓的反射,就是在运行状态中, ...

  3. java定时产生随机数_浅析Java随机数与定时器

    产生90-100的重复的随机数: public class RandomTest { public static void main(String[] args){ /* * Math.random( ...

  4. java取网页数据_浅析JAVA实现网页取内容

    有很多网站提供从其他网站提取新闻甚至是从向翻译网站取内容 由于手头做的网站需要涉及这个方面的内容,所以最近研究了一下 这里把我的一点小心得写给大家 希望大家讨论共同进步 首先我觉得这种功能的实现其实是 ...

  5. java static修饰方法_浅析Java中static修饰符

    1.概述 static关键字的中文意思是静态的,该修饰符可以修饰字段.方法.内部类.使用该关键字修饰的内容,在面向对象中static修饰的内容是隶属于类,而不是直接隶属于对象的,所以static修饰的 ...

  6. java 取整符号_浅析java中的取整(/)和求余(%)

    1.取整运算符 取整从字面意思理解就是被除数到底包含几个除数,也就是能被整除多少次,那么它有哪些需要注意的地方呢?先看下面的两端代码: int a = 10; int b = 3; double c= ...

  7. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  8. java 对象的定义是_浅析Java编程中类和对象的定义

    1,什么是类? 答:类是客观存在的,抽象的,概念的东西. 2,什么事对象? 答:对象是具体的,实际的,代表一个事物.例如:车是一个类,汽车,自行车就是他的对象. 关于类与对象的描述:类是对象的模版,对 ...

  9. java内存模型浅析_浅析java内存模型

    原标题:浅析java内存模型 Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的.Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型--又称为Java内存模型 ...

最新文章

  1. linux的上传工具,Linux下精简版上传工具lrzsz
  2. PLSQL_SQL Loader的概念和用法(概念)
  3. 王爽汇编语言 实验11
  4. Go学习笔记—Channel通道
  5. oracle数据库看开销,【Database】AIX系统下跟踪开销大的Oracle数据库进程
  6. 遗传算法的交叉变异详解
  7. composer切换源_composer的安装 及 常用命令(切换源等)
  8. kubernetes 日志定制查阅 - 排错 -- 好用的命令
  9. ruby写的BT种子解析器
  10. yaahp层次分析法步骤_什么是层次分析法?(文末附yaahp软件)
  11. matlab函数紫色代码,MATLAB 语法高亮颜色设置 - MATLAB - MathWorks 中国
  12. 使用js实现预览上传的图片
  13. VS2010 旗舰版和专业版 下载
  14. 使用cache tier
  15. 解决IE兼容H5的问题
  16. oracle存储过程if的使用,oracle存储过程if语句
  17. 云服务器连接不上怎么办
  18. 电源芯片选择DC/DC还是LDO?
  19. ubuntu Redis 数据库远程访问服务
  20. 3080算力添加、ValueError: Unknown CUDA arch (8.6) or GPU not supported 解决RTX30 运行深度学习代码报错

热门文章

  1. ftp4j的android应用
  2. Jquery_异步上传文件多种方式归纳
  3. hibernate 之HQL查询实例
  4. python闭包小例子
  5. n 个骰子点数和及各自出现的概率
  6. C++如何禁止函数的传值调用
  7. 全平台 Chrome 浏览器 44.0.2403.89 版本下载
  8. 第三周学习《对象与类》心得
  9. 将我人生的第一篇博客献给伟大的软件工程这门课程
  10. 搭建Hadoop2.6.4伪分布式