解惑

解己之惑,解人之惑

分类:Java (第12页共20页)

Java技术

我的持久层规范

昨天说了我的这个大轮子的大致情况,就是尽量保持简单,而配置最多的可能就是持久层和Action的配置,我的框架会完全取消这两个的配置,先说说持久层的情况。

  1. 类名和表名直接关联,关系是类名前带 t_
  2. 类的成员和表字段直接关联,名称完全一致,全部的表都需要一个名字为ID的主键,类型为long,由系统自动在插入的时候产生
  3. 表关联根据类之间的关联决定,如果两个类对对方都是直接引用,就是一对一,如果一个是直接引用,例外一个是集合,则是一对多,如果两边都是集合,就是多对多,对于集合的成员,其成员名是类名加s。多对多的表名是t_加两个类名,中间用_分隔,字段名就是类名加_id,如果是一对多,则外键名就是类名加_id
  4. 类型现在是自动匹配,也就是数据库的类型和类中的对应字段的类型是匹配的
  5. 主键的值在系统初始化的时候会从数据库表中读取最大值,然后缓存在系统中,每次加一
  6. 缓存的大小根据系统启动时数据库对应表的记录数决定,记录数小于一千的缓存100%,一千到一万的缓存50%,一万以上的缓存10%,十万以上缓存1%
  7. 类名可以分布在多个包中,配置文件配置都有那些包可以存放这些持久化对应的类,类名不可重复

根据这个规则,我完全取消了持久层的配置,对于新项目,这个规则的要求并不高,符合绝大部分的需要。至于查询,目前还没有完全想好,但是我考虑的是大部分的简单情况,只提供一个简单的对象表达式语法,复杂的查询还是使用SQL。

具体的例子:
阅读全文

KISS

记得最开始学习Java的时候就被它的KISS原则深深吸引了,因为那个时候正在为c++的各种语法而头疼。做了这么多年的Java开发,也感觉Java确实在语法和跨平台上符合它的这个原则,现在,Java的内容扩展越来越广,学习Java,使用好Java越来越需要对OO、设计模式、敏捷开发等深入理解并实践。
随着struts、spring和hibernate在国内的普及,越来越多的人得到提高,当然,我们也看到了以EasyJF为代表的国内开源力量的发展,在那些通用框架的基础上,他们期望能够进一步简化,实际上,我也在做这个工作,虽然我很欣赏spring和hibernate的灵活性,但是那么多的配置文件也是一个很头疼的事情,根据我自己的经验,很多应用没有必要进行配置,根据一定的规则就可以直接得到配置,为什么还要配置呢?即使是使用JDK5的新特性元数据进行简单配置我也感觉不是很必要,所以,我开始了我的大轮子计划,为自己定制一个最精简,最快速(性能和开发速度)的框架,在验证自己的设计能力的同时也可以强迫自己去学习别人的代码(但是不会全部照搬,也不会过度设计,需要的时候再重构),而且,这个框架我打算几乎完全自己构建,能够自己写的一定自己写,目前为止只使用了log4j和cglib这两个第三方的包,连连接池都是自己写的。在构造这个大轮子的过程中,我会把自己的心得体会写下来和大家交流。

使用ThreadLocal消除循环依赖

昨天刚刚说了在用Cglib完成我的持久层的设计,我实现了一个通用的clone方法,但是有一个问题,因为我在后台保留了一个和数据库记录对应的对象,其他的部分要使用的时候都是从那个记录clone一个出来,为了防止潜在的修改,必须进行深度clone,刚开始我就是用了一个简单的递归clone,但是不行,在存在关系的时候就会无休止的clone下去,最后StackOverflowError了。本来想把刚刚创建的保存下来标记一下,但是多线程不太好处理,最后想到的就是使用ThreadLocal,把刚刚clone出来还未进行深度clone的那个对象保存到ThreadLocal,如果它的关系类clone的时候需要使用对应的记录就直接返回那个引用而不是再clone,这样就不会StackOverflowError了。

使用Cglib

现在在做我的持久层,本来是打算现在就做延迟加载的,但是考虑到刚开始没有太大的必要,这个框架的定位还是快速开发,开发小型的应用,所以先完全加载,这样比较简单。不过还是先做了接口,开始使用的是JDK带的Proxy类,但是它只能创建Interface,不能扩展类,后来想到Cglib应该是做这个的,大致看了下,使用也很简单,就先写了一个简单的,目前只是延迟克隆(clone),因为我对数据库记录对应的对象只保留一个主要的,其他部分要使用,返回的是一个深度克隆的对象,现在使用Cglib返回一个增强的实例,保存了对那个数据库对象的引用,只有在对那个对象进行写操作的时候才进行真正的克隆并且把变化保存到克隆的对象,然后调用对象的save方法才会进行持久化并替换原来的对象,还不知道这样会有多大的性能提高,但是不会有太大的坏处。

类型转换和自动装箱

这段时间还在完成我的大轮子计划的持久化部分,本来想利用原来做的EJB单元测试的代码,结果发现自己还是对很多API不熟悉。我要将ResultSet的结果转换为Java的类型,本来是打算用一个工具类来转换的,结果发现ResultSet.getObject()返回的就是Java的类型。另外一个发现就是通过反射,JDK其实会自动为你进行装箱拆箱操作,如果传入的参数是Integer类型,而方法的实际类型是int,JDK会自动转换,反之也是一样,返回的结果是Integer,实际返回的是int,JDK也会自动转换,当然,这个JDK是1.4,不是JDK1.5。

待掌握的Eclipse快捷键

昨天整理了下我常用的Eclipse快捷键,今天看了下别人整理的,发现还有些需要掌握的:

  • Ctrl+D:删除光标所在行
  • Ctrl+K:将光标停留在变量上,按Ctrl+K键可以查找到下一个同样的变量
  • Shift+Ctrl+K:和Ctrl+K查找的方向相反
  • Shift+Ctrl+X:将所选字符转为大写
  • Shift+Ctrl+Y:将所选字符转为小写
  • Ctrl+M:快速对当前视图最大化
  • Ctrl+O:在代码中打开类似大纲视图的小窗口
  • 双击左括号(小括号、中括号、大括号),将选择括号内的所有内容。
  • Ctrl+1:光标停在某变量上,按Ctrl+1键,可以提供快速重构方案。选中若干行,按Ctrl+1键可将此段代码放入for、while、if、do或try等代码块中。
  • F3:打开声明该引用的文件

最后是一个可能不会常用的快捷键,如果掌握了这些想掌握的快捷键的话:CTRL+SHIFT+L:列出快捷键列表。

我最常用的Eclipse快捷键

有人整理了Eclipse的全部快捷键,但是要记住全部的快捷键也没有必要,下面的这些是我最常用的快捷键,和大家交流下:

  • CTRL+SHIFT+T:根据名字查找类,可以使用通配符,只能查找类,可以是工程引用的包中的类
  • CTRL+SHIFT+R:根据名字查找资源,可以是jsp,xml,js等任何文件
  • F11:以DEBUG模式运行上次运行的类
  • F5:单步进入,进入当前调试的代码行执行
  • F6:单步执行当前行
  • F8:执行到下一个断点
  • ALT+SHIFT+R:重命名选择的文件名,如果是类的话,将进行重构,同时修改相关的引用
  • ALT+上下箭头:将当前行或者选中的行上移或者下移一行
  • ALT+/:代码自动补全
  • CTRL+SHIFT+O:自动导入需要的类
  • CTRL+SHIFT+F:格式化当前文件或者选中的行
  • CTRL+L:定位到指定的行
  • CTRL+/:注释/取消注释
  • CTRL+ALT+H:打开调用层次,如果要知道一个方法的调用入口时很有用
  • CTRL+Z:取消上次修改(Undo)
  • CTRL+Y:重复上次修改(Redo)

提高Java技能的几种简单有效的方法

这个问题可能是很多做Java的人最关心的,特别是新手,而且我原来也写过一些东西,现在我再简单的列举一些简单但是行之有效的方法:

  • 上各个技术论坛看别人的帖子,特别是那些回复数或者点击数比较高的帖子,回复数高说明讨论激烈,很可能有高手在当中切磋,点击数高说明这个是大家很关心的,你以后很可能也会遇到或者用得上。
  • 尝试帮助别人解决问题,特别是你没有遇到过,但是你知道原因或者你懂得其中的原理,在这个过程中,你可以逐步的培养自己解决问题的能力、经验以及自信心。
  • 多看别人写的代码,无论是高手还是新手,从高手的代码你可以学习东西,从新手的代码中,你可以尝试去修改他的代码,让这个代码更加的高效、通用、简单,总之就是尽可能优化,直到你自己感觉很满意。
  • 注意积累自己的代码库,有时候是一个简单的方法,有时候可能是一个小的功能块,有时候甚至是一个比较大的子系统,以后自己要写一个系统,或者要设计一个系统,甚至你遇到设计问题的时候,你都可以到这些代码库中寻找思路甚至是直接拿来用。最重要的是,无论你认为自己的公司多么的差,多么的没有技术含量,你所在的项目肯定会有有价值的代码。(但是要注意,不要仅仅拷贝一份代码,要抽取你能够理解,并认为有价值的部分)
  • 多看书,系统的看书,不要浅尝辄止,要看那些经典的书。程序设计风格、设计模式、OO、重构都是必看的。
  • 最后也是最重要的是,遇到问题,要尽量去了解为什么会出现这样的问题,而不是仅仅停留在解决问题的层次。

如果你有信心并且确实可以在一个月之内找到一份满意的工作,你基本上可以算是高手(高手不一定高薪,但是温饱应该问题不大)了

最后是关于时间,众所周知,新手都会面临一个先有鸡还是先有蛋的问题,公司都要求你有经验,但是新手没有,所以你一定是一个蛋,你要把你的全部时间都花在提高自己上,少看些新闻,多看些书、看些帖子吧,当然,要花一些时间在锻炼身体上(呵呵,这个是我现在最大的感受)。关于加班,尽量避免,有两个方法,一个是提高自己的效率(使用合适的工具辅助,工欲善其事必先利其器),另外一个就是多思考你的那些工作是重复性的,怎么样可以少写一些代码。

软件开发必备的因素

现在的软件开发流程(或者是开发方法,例如CMM,RUP,XP等)有很多,但是对于很多小公司而言,不会完全去照搬一套流程,但是大公司肯定会选择一套标准的流程或者根据自己的情况定制一个合适的流程。我也在各种类型的公司都做过,因此也接触了很多种开发方式,对于一些小公司,揉合这些开发方法,提取切实可行又灵活的开发方法是一个不错的选择,就我而言,下面这些是一些容易做到也对公司对开发团队都很有利的一些内容:

  • 必须有源代码管理机制,推荐使用CVS或者Subversion
  • 一个项目或者产品的开发团队必须至少是三层的,最上面的就是PM,PSM,架构师或者总技术负责人之类的,负责总体的协调和管理,第二层就是小组长,必须对产品或者项目比较熟悉,可以解决小组成员60%以上的问题,然后就是开发人员,小组的结构应该是很小的,四个人为宜,一个组长加3个组员
  • 必须有内部的知识共享机制,可以选择论坛或者WIKI,搜索功能必须强大好用
  • 有IM可以及时的沟通,无论是否是分布式开发,即使在一个办公室里面也要有,如果为了防止外部的干扰,可以搭建内部的IM 服务器
  • 重要的讨论一定要通过邮件或者及时记录下来,把QA小组相关的人员也包含在内
  • 必须有单元测试,最好是全面的自动测试,但是QA小组的验收性测试依然是必不可少的
  • 要培养开发人员高质量的源代码意识,鼓励他们学习设计模式、重构,要求他们的源代码要便于维护、易读、格式统一、消除重复代码等(这个很多小公司最容易忽视,然后就是后面接手的人骂前面写那些代码的人)

Ant+JUnit+Cobertura

看标题就知道,这个是开发一个Java应用的利器组合,使用Ant完成工程的构建(Build),使用JUnit完成单元测试,使用Cobertura完成代码覆盖测试,也可以辅助查找性能瓶颈一些类型的BUG,下面是一个完整的build.xml范例,可以完全拿来用,不需任何修改,只要你的目录和这里的目录一致(应该也是很通用的):

下载下面的build.xml文件

文件内容:
阅读全文

更早的文章 更新的文章

© 2025 解惑

本主题由Anders Noren提供向上 ↑