对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 ...
随机推荐
- 算法复习——1D/1Ddp优化
搬讲义~~~~ 题目1:玩具装箱(bzoj1010) Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一 ...
- RestAssured打印日志到文件中的方法
参考https://stackoverflow.com/questions/14476112/how-to-get-rest-assured-log-into-something-printable- ...
- OpenJudge 东方14ACM小组 / 20170123 02 岛屿
总时间限制: 40000ms 单个测试点时间限制: 4000ms 内存限制: 128000kB 描述 从前有一座岛屿,这座岛屿是一个长方形,被划为N*M的方格区域,每个区域都有一个确定的高度.不 ...
- 容器中元素的去重——ans.erase(unique(ans.begin(),ans.end()),ans.end());
啊,原来unique()函数,只是处理的连续的元素,比如 -1 -1 -1 1 2 -1 2 就处理成了 -1 1 2 -1 2 -1 -1并且返回5,之后eraser(5,7)剩下了 -1 1 2 ...
- LeetCode OJ——Validate Binary Search Tree
http://oj.leetcode.com/problems/validate-binary-search-tree/ 判断一棵树是否为二叉搜索树.key 是,在左子树往下搜索的时候,要判断是不是子 ...
- HTML-loading动画1
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- js-判断移动端用户是横屏放的还是竖屏放的
在一些移动端页面中,页面的样式我们就支持竖屏播放,这时我们就需要判断是横屏还是竖屏了,不同的方向显示冉的样式. //判断手机横屏竖屏 var html = ""; window.a ...
- win10下Vmware12虚拟机安装Ubuntu16.04
一.下载VMware虚拟机: VMware12下载地址:点这里 VMware 12pro 专业版永久许可证密钥: 5A02H-AU243-TZJ49-GTC7K-3C61N 如果许可证不能用,参考这 ...
- OS | monolithic kernel & microkernel
A monolithic kernel is a kernel where all services (file system, VFS, device drivers, etc) as well a ...
- 深入理解Atomic原子类
Atomic是基于unsafe类和自旋操作实现的,下面以AtomicInteger类为例进行讲解. 要理解Atomic得先了解CAS CAS CAS全程Compare And Swap ,是条并发原语 ...