对JavaBean创建的一点改进
在看了《Effective Java》Item2中对JavaBean的描述后,再结合Item1和Builder模式,遂想有没有其他方式避免JavaBean创建的线程安全问题呢?
以如下JavaBean类为例,
public class JavaBean {
private int count;
private String level;
private List<String> messages;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public List<String> getMessages() {
return messages;
}
public void setMessages(List<String> messages) {
this.messages = messages;
}
}
分步创建对象如下,因为几个set方法的调用导致对象的状态可能不一致,存在线程安全问题。比如javaBean对象在执行一系列set方法过程中,其他线程调用get方法,这时得到的属性值可能就不对了。
JavaBean javaBean = new JavaBean();
javaBean.setCount(1);
javaBean.setLevel("first");
javaBean.setMessages(new ArrayList<String>());
为了避免创建过程中被访问,可以用匿名对象+链式调用的方式,如下代码,
public class JavaBean {
private int count;
private String level;
private List<String> messages;
public int getCount() {
return count;
}
public JavaBean setCount(int count) {
this.count = count;
return this;
}
public String getLevel() {
return level;
}
public JavaBean setLevel(String level) {
this.level = level;
return this;
}
public List<String> getMessages() {
return messages;
}
public JavaBean setMessages(List<String> messages) {
this.messages = messages;
return this;
}
}
JavaBean javaBean1 = new JavaBean().setCount(1).setLevel("second").setMessages(new ArrayList<String>());
System.out.println(javaBean1.getLevel());
以上写法只有对象完全初始化好后,才将引用赋给javaBean1,避免创建过程中被其他线程访问。
但这个时候,以上分步创建对象的方式仍然可以用。怎么能强制使用链式调用呢?想来想去觉得还得对链式调用进行封装。
增加如下代码,
private JavaBean(){ }
public static JavaBean newInstance(){
return new JavaBean();
}
public static JavaBean newInstance(int count, String level){
return new JavaBean().setCount(count).setLevel(level);
}
这样一来,实际上跟直接使用参数化的构造函数一样,如下
public JavaBean(){ }
public JavaBean(int count, String level){
this.count = count;
this.level = level;
}
总结:
1. 在写JavaBean时,set方法尽量返回JavaBean类型;
2. 在创建对象时,尽量使用链式调用。
对JavaBean创建的一点改进的更多相关文章
- iScroll-5拉动刷新功能实现与iScroll-4上拉刷新的一点改进
近来在学习移动设备的应用开发,接触了jQuery mobile,在网上查阅相关资料时发现一个叫”iScroll“的小插件.其实这个iScroll插件跟jQuery mobile没有多大关系,并不是基于 ...
- 根据JavaBean创建数据库的操作SQL
根据JavaBean创建数据库的操作SQL import java.lang.reflect.Field; public class GenerateSQL { public static void ...
- iOS单例创建的一点疑惑
线程安全的单例常用写法, +(AccountManager *)sharedManager{ static AccountManager *defaultManager = nil; disptch_ ...
- 实验4 JavaBean创建和使用(计算器)
实验4 JavaBean创建和使用 一.实验目的 1.掌握JavaBean创建和使用方法: 2.领会JavaBean简化页面设计的优势等. 二.实验内容 1.设计诸如以下页面的简单计算器 要求:完成 ...
- x01.Weiqi.8: 一点改进
原来的代码全部删除,进行了深层次重构,得其意而忘其言.得意之处有二: 1.关于显示 以 StoneSize 属性为依托,在 set 中加了一句:Width = Height = m_StoneSize ...
- Winform(C#.NET)自动更新组件的使用及部分功能实现(一点改进功能)
接前两篇继续: Winform(C#.NET)自动更新组件的使用及部分功能实现 Winform(C#.NET)自动更新组件的使用及部分功能实现(续) 借鉴文章:http://www.cnblogs.c ...
- CoreText精彩文字轮廓绘制动画的一点改进
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 原文在: http://oleb.net/blog/2010/ ...
- Log4net的一点改进
昨天把log4net更新了一下,发现从NUGET上安装log4net后,使用方式简化了许多.以前我在文章<log4net使用简介>中介绍过,使用log4net需要有两步前期准备工作: 在使 ...
- Effective Java - [2. 创建与销毁对象]
让对象的创建与销毁在掌控中. Item 1: 使用静态工厂方法而非使用构造函数 public static Boolean valueOf(boolean b) { return b ? Boolea ...
随机推荐
- HDU——1009FatMouse' Trade(贪心+结构体+排序)
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU-3523 Image copy detection
题意难懂... 大意上说就是给m个排列P1,P2,P3...Pm,自己求个排列T使得T与Pi的各个数的绝对值差之和最小. 其实也就是二分最小匹配了.... #include <cstdlib&g ...
- 如何用1个小时了解JSON
W3school ↑↑↑学这个,1个小时够了.下面是节选: 代码例子1: <html> <body> <h2>在 JavaScript 中创建 JSON 对象< ...
- 常用快捷键以及linux命令整理
关于快捷键的使用,网上有很多.自己在使用过程中不断整理用到的知识点.一个项目完成了就把涉及用到的快捷键和命令介绍给大家,都是一些比较基础的,常用的命令.希望大家有好的知识点,命令可以及时交流整理. 一 ...
- Introduction to the WinPcap Networking Libraries
Introduction to the WinPcap Networking Libraries use wire shark or fiddler
- iOS开发之手势gesture详解(二)
与其他用户界面控件交互 UIControl子类会覆盖parentView的gesture.例如当用户点击UIButton时,UIButton会接受触摸事件,它的parentView不会接收到.这仅适用 ...
- Struts学习总结(一)
1,需要包下载地址: http://archive.apache.org/dist/struts/binaries/ 2.报错:org/apache/commons/lang3/StringUtils ...
- LeetCode OJ--Permutations II
给的一个数列中,可能存在重复的数,比如 1 1 2 ,求其全排列. 记录上一个得出来的排列,看这个排列和上一个是否相同. #include <iostream> #include < ...
- Manajro17配置
:Manjaro近来点击率一直排行第一,比较适合笔记本使用,这次从下载刻录开始讲述: 1: 下载刻录 因为一些环境特殊原因,官网下载还是比较慢的,普通用户还是从清华镜像源下载比较快,当然你也可以选择官 ...
- [Machine Learning with Python] Familiar with Your Data
Here I list some useful functions in Python to get familiar with your data. As an example, we load a ...