讨论有状态和无状态的对象
来源:互联网 发布:js获取asp控件的值 编辑:程序博客网 时间:2024/05/17 01:59
java编程中对象的有状态和无状态含义说明
网上很多解释如下:
1、有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。
2、无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象.不能保存数据,是不变类,是线程安全的。
个人理解:
说一说什么叫状态?
百度百科中的说明为“物质状态,是指物质系统所处的状况,由一组物理量来表征”,
在java编程的世界里可以理解为“对象的状态,是指当前对象中成员变量所存储的数据情况”,状态就是随着时间而变化的数据,这些数据是已经被存储下来的数据。
所谓对象的“无状态”表现形式个人觉得应该这样理解比较好:“一次操作,不需要将操作的数据或操作过程中产生的数据存储下来,直接返回操作结果即可,而且每次的操作互不影响”。
举例说明(根据网上很多关于有无状态说明的博客内容)
看看Spring中所谓的有状态(Stateful)和无状态(Stateless) Bean
1. 默认情况下,从Spring bean工厂所取得的实例为singleton(scope属性为singleton),容器只存在一个共 享的bean实例,Spring在Controller层就是默认采用singleton模式来实例化bean对象。
如果在Controller层的bean对象中定义了成员变量,并且创建了变量对应的getter和setter方法,那么可以说这个对象具备了有状态对象的特征 :“数据存储功能”, 这样做在多线程环境下不安全,所以一般不建议在Controller层创建成员变量。如果想要在Controller层中的Bean中定义成员变量用来存储数据,那么建议设置Spring采用Prototype模式实例化Bean。
2. 在Service层、Dao层用Spring也默认采用singleton模式实例化对象,虽然Service类也有dao这样的属性,但dao这些类都是没有状态信息的,也就是相当于不变(immutable)类,所以Service层的Bean也都属于无状态对象。
3. 无状态的Bean适合用不变模式,技术就是单例模式,这样可以共享实例,提高性能。有状态的Bean,多线程环境下不安全,那么适合用Prototype原型模式。Prototype: 每次对bean的请求都会创建一个新的bean实例。
有状态的bean使用prototype作用域,无状态的bean则应该使用singleton作用域。
参考
http://blog.csdn.net/aaa1117a8w5s6d/article/details/8295439
其他的关于无状态说明的文章,比如http中的无状态说明可参考
http://blog.csdn.net/fengyinchao/article/details/50774738
- 讨论有状态和无状态的对象
- 有状态对象和无状态对象
- 有状态对象和无状态对象
- EJB 有状态的对象和无状态的对象
- 有状态对象和无状态对象的区别
- 有状态和无状态的对象区别
- 有状态 无状态对象
- 有状态和无状态的区别
- 有状态和无状态的Servlet
- 有状态和无状态
- 有状态和无状态
- 有状态和无状态
- 有状态的EJB对象和无状态的EJB对象
- 面向对象设计讨论:有状态类还是无状态类?这是个难题
- 线程安全,有状态,无状态的对象
- 线程安全,有状态,无状态的对象
- 线程安全,有状态,无状态的对象
- 线程安全,有状态,无状态的对象
- ImportError: No module named lmdb解决办法
- 规则推理算法:Treat
- mock server
- 类的定义
- 回溯算法总结
- 讨论有状态和无状态的对象
- C#控件之DateTimePicker控件使用
- 掏钱总是痛苦的
- mac python3.* ModuleNotFoundError: No module named 'MySQLdb'
- 运行窗口常用命令(持续更新)
- HDU5950 Recursive sequence(矩阵快速幂)
- eclipse修改Java文件的编码
- Android编译分析
- Integer和int的区别?在什么时候用Integer和什么时候用int