Saturday, March 12, 2011

对象初始化顺序导致的问题

废话少说,直接上代码。
public abstract class Container{
 private Map<Integer,Integer> maps = new HashMap<Integer,Integer>();
 private final int position;
 private final int status;
 public Container(int pos,int status){
    this.position = pos;
    this.status = status;
    load();
 }
 protected void load(){
  maps.put(1,1);
  ...
 }
}

public class Stall extends Container{
 private Map<Integer,Integer> itemMoneys = new HashMap<Integer,Integer>();
 public Stall(int pos){
  super(pos,Constants.STALL);
 }
 @Override
 protected void load(){
   itemMoneys.put(1,1000);
   ...
 }
}
调用类:
Stall stall = new Stall(100);

//红色处抛出NullPointException异常,一开始总是想不明白是什么问题,后来跟同事讨论,同事给出正确问题,因为在Stall构造方法调用了super的构造方法,而构造方法里调用了load方法,子类重写了load方法,而此时子类还没有初始化完,也就是说itemMoneys还没初始化,所以才会抛出异常。

Friday, March 11, 2011

Netty 3.2.1 API中文版初稿

终于花了2个月的时间基本翻译完了Netty的API,还差几个codec包没完成,先把完成的放出了,翻译的不好的请大家指出完善。

Saturday, January 22, 2011

CopyOnWriteArrayList中的设计疑问和原因

最近重新看看java.util.concurrent包中的类源码,发现一个有趣的设计,在CopyOnWriteArrayList中有几个方法都使用了本地引用,如下方法:

    public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
   Object[] elements = getArray();
   int len = elements.length;
   Object[] newElements = Arrays.copyOf(elements, len + 1);
   newElements[len] = e;
   setArray(newElements);
   return true;
} finally {
   lock.unlock();
}
    }
如红色代码,很是疑惑,最后在mail-list上发现有人也问下相应的问题。Bowbeer(JCIP作者之一)是这么回答的。
Note that this is a local reference not a local copy. Reusing a local reference eliminates one (slower) instance variable lookup at runtime
大概意思是说本地引用和本地拷贝不同,本地引用可以减少实例在运行时的查找时间。

Friday, October 22, 2010

XPlanner 与 Eclipse 同步 Task

  实施Scrum已经有两年多了,一直是使用XPlanner作为项目管理工具的,使用XPlanner主要是因为它比较容易操作,当然它还有其他优秀的方面,更多的XPlanner与JIRA的比较就不在这里讨论了,接下来就讲一下如何把XPlanner的User Story与Eclipse的Task进行同步。
  1.下载Mylyn和XPlanner Connector



  2.到http://www.xplanner.org下载XPlanner,部署方法在下载下来的压缩包中的README.txt写得非常详细,要注意一点的是如果你是使用jdk6的话,那启动tomcat的时候就会报错,主要原因是spring-beans.xml中的配置已经不对了,修改如下:
把原来这句

  <bean id="metaRepository" class="com.technoetic.xplanner.domain.repository.MetaRepositoryImpl">
    <property name="repositories">
      <map>
         ....
      </map>
   </property>
  </bean>
改成

  <bean id="metaRepository" class="com.technoetic.xplanner.domain.repository.MetaRepositoryImpl">
    <property name="repositories">
       <bean class="java.util.HashMap">
<constructor-arg>
         <map>


           ....
         </map>
       </constructor-arg>
      </bean>
   </property>
 </bean>
  3.启动Xplanner,并添加相应的Project和task,如下
  4.接下来要在Eclipse中添加Repository,操作如下

    5.大功告成,现在可以在Eclipse编辑任务和提交任务了