《重构》学习笔记-重构原则

码农真得很辛苦,每天除了要下地编码之外,还需要挑灯夜战,学习专业知识,唉。不抱怨了,抱怨都是那些自暴自弃的人愤世嫉俗的。最近看《重构》一书,话说是一本很多人推荐看的好书,封面上还写着“从初级程序员到编程高手的秘籍”。好吧,我承认是初级程序员。所以我看了。 第一章 与其他书不同,第一章是一个例子。很多书,包括大学教材啊,技术教材都是以要讲的内容的定义和一些学习的重要意义之类的做第一章,而此书却给了一个系统的小部分代码来做重构的小例子。这样写的原因作者说了,不过对于我们这种应试教育下出生的人来说有点小小的不习惯。 public String statement() { double totalAmount = 0; //总消费余额 int frequentRenterPoints = 0; //常客积点 Enumeration rentals = _rentals.elements(); String result = "Rental Record for " + getName() + "\n"; while(rentals.hasMoreElements()) { double thisAmount = 0; //取得一笔租借记录 Rental each = (Rental) rentals.nextElement(); //determine amounts for each line switch(each.getDaysRented() > 2) { //取得影片租价格 case Movie.REGULAR: //普通片 thisAmount += 2; if (each.getDaysRented() > 2) thisAmount += (each.getDaysRented() - 2)*1.5; break; case Movie....

July 28, 2013

保护眼睛,设置eclipse文本编辑背景色为自然绿

“色调”的参数设置为85,把“饱和度”参数设置为123,把“亮度”参.数设置为205 红199 绿237 蓝204

July 26, 2013

我的第一篇博文

开始 终于有了自己的域名,在Github上开了自己的博客。之前也坚持写过博客,可惜赶上妻子怀孕和儿子出生,忙里忙外了一年后,博客就再没更新。这次申请了自己的域名,就是希望给自己点动力,再开始自己的博客。 ##为什么要写博客 这个问题很严肃,我也不清除为什么要写博客,就是有一种写博客的想法。如果说分享技术心得,说句实话,我不是那种技术大牛,充其量就是一个普普通通的程序员,我有的技术,相信大部分程序员也知道。而且我的文笔极差,初高中每次语文考试作文都是不及格的份,写个文章出来我都觉得对不起读者。不过还是鼓起勇气来写博客,可能是那些黑客精神看多了,也可能是想着记录自己的生成吧。不管什么愿意,我的欲望已经迫使我去完成这件事了。 自己介绍 一个工作了五年的程序员,2008年毕业后就从事Java开发工作,前三年都在蹉跎岁月,后来才该为自己的人生奋斗。不过努力了两年,还在迷茫中。 本人喜欢新奇的事务,但没什么恒心,兴趣转移也快,经常是看下这个,搞搞那个,结果都是一事无成。现在只希望这个博客不要半途而废。虽然认识自己的缺点不容易,不过也不能无止境的说自己的坏话。 关于域名 域名中姓氏放到了后面,这个并不是我崇洋媚外,也不是赶时髦,只是不知道谁注册了我姓名的域名,还拿去卖玩具,哎。 打算 先把以前的写的文章搬过来,期间把网站美化下。剩下的就是持续写。

July 25, 2013

Mybatis返回特殊Map

想返回个特殊实体,一个Map,key是一个表的一个字段的值,value是另一个表的所有记录。参考了下网上的“攻略”,不过和攻略里面讲的有点不同,那里面key的值value的实体实在同一个表内,如果不同表,会报缺少set方法的异常。解决方法很简单,就是在实体里面加个字段对应的属性。但是并不愿意为了一个查询语句就要去改变实体。 无聊看了下session的select,提供了通过 ResultHandler 来处理返回的结果集。所以尝试着解决这个问题。 mapper.xml里面的配置如下: <resultMap type="HashMap" id="testMap"> <result column="UA_INFO" property="key" /> <association property="value" resultMap="com.xxx.xxx.BaseResultMap"> </association> </resultMap> <select id="getUaMapByTimestamp" parameterType="Map" resultMap="testMap"> SQL语句 </select> com.xxx.xxx.BaseResultMap是另一个实体的mapper的resultMap。这个查询,返回的每一条记录都是 {key=..., value=...} 这个结果集并不符合要求。不过通过ResultHandler来处理每一条记录就可以达到要求了。 看下Mybatis源码里面有关继承 ResultHandler 的 DefaultMapResultHandler类。 public class DefaultMapResultHandler<K, V> implements ResultHandler { private final Map<K, V> mappedResults; private final String mapKey; @SuppressWarnings("unchecked") public DefaultMapResultHandler(String mapKey, ObjectFactory objectFactory) { this.mappedResults = objectFactory.create(Map.class); this.mapKey = mapKey; } public void handleResult(ResultContext context) { // TODO is that assignment always true?...

August 4, 2012

Java可变参数方法及它的重载

JAVA支持方法的可变参数。类似如下 public void method1(String... arg1); 这样,调用method1时候,参数的数量是可变的,如method1(“1”,“2”,“3”)。注意可变参数只能是最后一个参数。 JAVA内部是把这样的参数看成一个数组来处理。在获取多个参数的时候可以用数组遍历来完成。 for (String temp : arg1) { System.out.println("one of the arguments is " + temp); } 可能有人会说,这样的循环遍历像List那样的集合也可以,凭什么说是数组。那好,再看下面代码: public void method1(String... arg1); public void method1(String[] arg1); 这样的重载,在编译时候会报错,JAVA不允许这样的重载,其实理由很简单,String… 和String[]对编译器来说是一样的。参数一样自然无法重载。 下面是可变参数方法的重载: public void method1(String... arg1) { } public void method1(String a, String... arg1) { } 我在eclipse中测试,IDE并没有提示错误。但是在实例后调用就不行了,IDE报 The method method1(String[]) is ambiguous for the type ...,大致是说这个方法有混淆,无法正确的调用。话说类编译的时候没问题,到实例后调用就会提示错误。 public void method1(String... arg1) { System.out.println("1"); } public void method1(String a, String b) { System....

April 28, 2012

Hibernate获取返回值报XXX connot be cast to [Ljava.lang.Object

今天在测试时候发现在获取Hibernate返回数据时候报 java.math.BigDecimal cannot be cast to \[Ljava.lang.Object 异常,但是查看了代码,很简单也很平常,createNativeQuery执行,getResultList获取结果集,每行都用Object[]类型。调试时候发现返回结果集为[2],也就是就一行且一个。也就是说,每行的类型不再是 Object[]。 按以往, getResultList 的返回是一个 List(Object\[\]),当如果返回只有一个,比如1或2是,类型就变成了该数据库字段所对应的类型,在我这里就是BigDecimal。 真是不明白,多个就是Object[],一个就变成不是数组了。 Hibernate莫名其妙啊。发下牢骚。。。

November 3, 2011

itext中文本的绝对位置放置

text中表格可以使用 table.writeSelectedRows(0, -1, x, y, writer.getDirectContent()); 来实现绝对位置放置。那文本段落呢… 当我们不需要itext对每个单词、句子、段落实现自动格式的时候,或是想使用特殊布局,就可以使用PdfContentByte来实现绝对位置放置。 PdfContentByte的初始化: PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("test.pdf")); PdfContentByte cb = writer.DirectContent; 将文本写入ContentByte中时,必须使用方法beginText()和endText(),同时也必须设置字体和尺寸。有两种方法来写入和放置文本。 方法一: BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); cb.beginText(); cb.setFontAndSize(bf, 12); cb.showTextAligned(PdfContentByte.ALIGN_CENTER, text + "This text is centered", 250, 700, 0); cb.endText(); 方法二: BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); cb.beginText(); cb.setFontAndSize(bf, 12); cb.setTextMatrix(100, 400); cb.showText("Text at position 100,400."); cb.endText();

May 12, 2011

用apache的ant解压zip文件(中文文件或文件夹解决方法)

昨天在研究用apache的ant包来解压zip文件,把经验写下来与大家分享。 写贴上代码 package upzip; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import org.apache.tools.zip.*; import java.util.Enumeration; /** * 压缩解压ZIP文件 * @author Administrator * */ public class AntZip { private ZipFile zipFile; private static int bufSize; //size of bytes private byte[] buf; private int readedBytes; /** * * @param bufSize 缓存大小 */ public AntZip(int bufSize){ this.bufSize = bufSize; this.buf = new byte[this.bufSize]; } public AntZip(){ this(1024); } /** * 生存目录 * @param directory 解压文件存放目录 * @param subDirectory 子目录(没有时可传入空字符串) */ private void createDirectory(String directory, String subDirectory) { String dir[]; File fl = new File(directory); try { if(subDirectory == "" && fl....

March 4, 2011

ClientAbortException: java.net.SocketException:”异常的问题

前几天,在做图片以stream形式输出到页面上展现的时候,后台一直报异常,且页面上图片无法正常现实。异常内容为: ClientAbortException: java.net.SocketException: Software caused connection abort: socket write error at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358) at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434) at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:309) at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:288) at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:98) at javax.imageio.stream.FileCacheImageOutputStream.close(FileCacheImageOutputStream.java:213) ...... 在网上找了好久,发现是个普遍问题,但原因各异,有人总结为: 1:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down掉; 2:客户关掉了浏览器,而服务器还在给客户端发送数据; 3:浏览器端按了Stop; 4:服务器给客户端响应结果给防火墙拦截了。 这些原因太过笼统,细查错误很难。 偶然在一个英文网页上看到了条有关这个异常的,本人英语水平差,只能说个大意: 这个已知异常出现在IE浏览器显示tif格式的图片的时候。 亲自试验了下,的确在chrome和火狐上显示时,后台不会报次错误,不过图片显示有点异样。因为图片是存于数据库的BLOB类型的字段中,所以一直没注意图片的格式,后来才发现,原来图片是gif格式,而我使用ImageIO.write(img, “jpeg”, response.getOutputStream());输出成jpg格式的图片,以致导致IE浏览器对图片解析有问题。在此将jpeg改成gif后不再出现异常。 忙乎了一天多,结果问题出在这里。 其问题导致的原因可能是:IE浏览器在解析错误图片格式或不支持的图片格式时,可能向服务器发送了多次请求或是直接关闭了连接,从而导致了tomcat报次异常。

December 8, 2010