这篇文章主要介绍了Java如何更好地管理你的对象,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。
有一天晚上我脑海中突然冒出来一个问题:“怎样管理我们代码中的对象”。
小弈是刚工作时的我,他说:通过新来创建一个对象然后直接使用就好了啊。
公共类HelloWorld { 公共空间hello () { System.out.println (“hello world !”); } } HelloWorld HelloWorld=new HelloWorld (); helloWorld.hello ();
你们看,我有一个HelloWorld类,我用新就能直接创建一个对象,然后就能使用这个对象中所有的方法了,多简单啊。
二弈是工作两年的我,他一脸鄙视的对小弈说,你别整天HelloWorld好不好,还有啊,除了新的你就不会其他的了,能不能有点追求啊?
小弈对二弈说那你说除了新还有什么办法啊?
二弈说可以通过类的newInstance或者构造函数的newInstance来创建对象实例啊。
不过你得记住,类的newInstance只能对那些拥有可见的(访问)无参构造函数的类,才能进行对象的实例化,而构造函数就没有这些限制。
大弈是工作三年的我,他说,虽然你们的方法都可以用来创建对象,但都还是手动创建的,太原始了,生产力太低。
工欲善其事,必先利其器,我们也得找个高效的生产力工具.IOC容器你们了解吧?
以前我们在一个对象中如果要调用另外一个对象的方法时,都是通过新的或者反射来手动创建该对象,但是每次都这样做太累了,并且类之间的耦合也很高。
通过国际奥委会容器,我们可以把所有的对象交给容器来管理,在使用之前只需要定义一下对象,然后再使用到该对象时,国际奥委会容器就会帮我们把该对象初始化好,这样是不是更方便呢?
大弈说完,举了一个例子:
@ bean 公开课RegisterService { 公共空间注册(){//做登记 } } @ bean 公开课LoginService { 公共空间登录(){//登录 } } @ bean 公开课HelloWorld { @ autowired 私人RegisterService RegisterService; @ autowired 私人LoginService LoginService; 公共空间hello () {//注册 registerService.register ();//?/登录 loginService.login (); } }
奥委会容器通过一种叫Bean的注解,在系统启动时扫描所有通过豆标注的类,对这些类进行实例化,然后将所有的对象都保存在容器中。再扫描所有通过Autowired标注的属性或者方法,从容器中找到与之匹配(通过名称或者类型等)的对象将具体的对象赋值给这些属性。这样我们就可以直接将这些对象拿来使用了,作为一个伸手党是不是很幸福啊。
老弈是工作五年的我,他听了大弈的话后,提出了一个问题,对于新的项目可以使用这种国际奥委会的容器,可是对于那些遗留的老项目来说,要使用IOC来改造是不太符合实情的。
我举个例子,在一个遗留的老项目中,有一个核心的接口处理程序:
公共接口Handler<点播,RES>{ RES处理(点播请求); }
处理程序接口有很多的实现类,我们需要对不同的请求来调用不同的处理程序实现类进行处理,如果用国际奥委会容器来管理这些实现类,显然不太合适,因为我们处理之前是不知道该用哪个处理器实现类的。
大弈想了想,如果处理器接口只有几个固定的实现类,并且在使用时只会使用一个来进行处理,那么倒是可以在启动前通过配置的方式来确定具体使用哪种处理程序,比如可以通过@Conditional根据某些条件来确定加载具体的对象,但是这种要在使用时才能确定处理程序对象的类型确实比较棘手。
老弈看大家都不说话了,就继续说了下去。
为了要在调用方法时使用不同的处理程序来处理不同的而请求,需要确定两种类,一种是请求类,一种是处理类,并且要让请求类和处理类一一对应起来。
假设我们的请求类是一个包类,每一个具体的请求类都继承自这个基类。
那么想要确定每一个具体的包是什么类型的,可以有很多种方法,可以为每个包取一个唯一的名字,例如:
公共抽象类包{ 公共抽象字符串名称(); }
也可以为每一个包指定一个标志,例如:
公共抽象类包{ 公共抽象int符号(); }