<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>世说新语</title>
    <description></description>
    <link>http://mahuangyihao.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>UML类图中5中关系的辨析（修订）</title>
        <author>世说新语</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mahuangyihao.javaeye.com">世说新语</a>&nbsp;
          链接：<a href="http://mahuangyihao.javaeye.com/blog/186875" style="color:red;">http://mahuangyihao.javaeye.com/blog/186875</a>&nbsp;
          发表时间: 2008年04月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><br id="yth8" />
</p>
<div id="u7ge" style="padding: 1em 0pt; text-align: left;"><img src="http://docs.google.com/File?id=df63n6js_142cg4snnhf_b" id="h5_r" alt="" style="width: 553px; height: 206px;" />
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Figure 1. UML offers five different types of class relationship</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;
<span id="jzhq">要理解这5中关系就不能简单的把它们和具体的语言实现相关联，UML介于问题域和解域之间，因而兼有这两者的概念。虽然类图是静态的，但类之间的这5种关系却是动静兼有的（也就是编译时和运行时混合的）。</span>
</p>
<p><br id="q:8i" />
&nbsp;&nbsp;&nbsp;&nbsp;
<span id="ivd0" style="font-weight: bold;">问题域、解域混合，编译时、运行时混合是这5种关系的特点。</span>
<br id="x514" />
</p>
<p><span id="jzhq">
<div id="y-8z">
<table cellspacing="0" border="1" id="t8tz" cellpadding="3">
<tbody id="gn6t">
<tr id="ci05">
<td id="ali6" width="16%"><br id="znji" />
</td>
<td id="ku3o" width="16%">用词<br id="drrt" />
</td>
<td id="r-o2" width="16%">问题域<br id="pmls" />
</td>
<td id="h2uh" width="16%">解域<br id="lnr5" />
</td>
<td id="mgxk" width="16%">编译时<br id="i1tn" />
</td>
<td id="ifkl" width="16%">运行时<br id="abk3" />
</td>
</tr>
<tr id="fugi">
<td id="pw8q" width="16%">Dependency </td>
<td id="zy65" width="16%">uses a<br id="xia2" />
</td>
<td id="smi7" width="16%">短暂的或者对非业务类的（如工具类）依赖<br id="rhnx" />
</td>
<td id="g6n1" width="16%"><span id="jzhq"><strong><span id="jzhq">作用域在方法内部的reference（可能是方法参数或方法内部声明的</span>
<span id="jzhq"><span id="jzhq">reference</span>
</span>
<span id="jzhq">）</span>
</strong>
</span>
</td>
<td id="idpi" width="16%"><strong><span id="jzhq">作用域在方法内部的reference（可能是方法参数或方法内部声明的</span>
<span id="jzhq"><span id="jzhq">reference</span>
</span>
<span id="jzhq">）</span>
</strong>
</td>
<td id="zwlx" width="16%">短暂的<br id="ky1s" />
</td>
</tr>
<tr id="swos">
<td id="zh-g" width="16%"><span class="docEmphasis" id="zz_-">Association</span>
 </td>
<td id="s76y" width="16%">has a<br id="fb-m" />
</td>
<td id="jcxz" width="16%">相对固定的，对业务类的依赖<br id="z4iz" />
</td>
<td id="ouu-" width="16%"><span id="jzhq"><span id="jzhq">类属性</span>
</span>
</td>
<td id="g333" width="16%"><span id="jzhq">类属性</span>
</td>
<td id="io_p" width="16%">持续一定时间的<br id="mrc9" />
</td>
</tr>
<tr id="m16m">
<td id="cze4" width="16%">Aggregation </td>
<td id="srd2" width="16%">owns but may share<br id="k-0q" />
</td>
<td id="k8.i" width="16%"><span id="jzhq">owns but may share</span>
</td>
<td id="chou" width="16%"><span id="jzhq"><span id="jzhq">类属性</span>
</span>
</td>
<td id="w6pv" width="16%"><span id="jzhq"><span id="jzhq">类属性</span>
</span>
</td>
<td id="z5l_" width="16%">生命线可能相关联<br id="dfpd" />
</td>
</tr>
<tr id="ft9q">
<td id="k4bs" width="16%">Composition </td>
<td id="hm1y" width="16%">is part of<br id="utr8" />
</td>
<td id="z9sv" width="16%"><span id="jzhq">is part of</span>
</td>
<td id="ic26" width="16%"><span id="jzhq"><span id="jzhq">类属性</span>
</span>
</td>
<td id="k9yt" width="16%"><span id="jzhq"><span id="jzhq">类属性</span>
</span>
</td>
<td id="cts-" width="16%">生命线总是关联<br id="mo_8" />
</td>
</tr>
<tr id="evfk">
<td id="kq9z" width="16%"><span id="j-eq">Generalization</span>
<span id="j-eq" style="font-weight: bold;"> </span>
</td>
<td id="yj35" width="16%">is a type of<br id="a-2c" />
</td>
<td id="sd:n" width="16%"><span id="jzhq">is a type of</span>
</td>
<td id="s-8d" width="16%">继承<br id="o_xb" />
</td>
<td id="byr0" width="16%">继承<br id="ugne" />
</td>
<td id="rp_o" width="16%"><br id="n2o4" />
</td>
</tr>
</tbody>
</table>
</div>
</span>
</p>
<p>&nbsp;</p>
<p><br id="ohzf" />
<br />
<span id="xlpu" style="font-weight: bold;">Dependency依赖:uses a</span>
</p>
<p>&nbsp;&nbsp;&nbsp; Dependency表示一个类uses或者知道另一个类。一方的改动将引起另一方的改动。这是一种典型的临时关系，代表了类之间的一种短暂的交互。</p>
<p>&nbsp;&nbsp;&nbsp; 针对&ldquo;一方的改动将引起另一方的改动&rdquo;这句话来讲，<strong>所有强于dependency的关系都蕴含/隐含者dependency关系</strong>
。且这个意义常用来表示package之间的依赖关系。（package之间只有依赖和继承2种关系）</p>
<p>&nbsp;&nbsp;&nbsp; 因为是一种短暂的关系，所以依赖类指向目标类的reference的作用域一般在一个方法的内部（这有可能是方法的传入参数或者在方法内部声明的reference），<strong>而不是</strong>
类的属性。因为属性代表一种相对持久的关系，而方法内部的对象，只有在方法被调用时（短暂的）才与依赖类（方法所在的类）发生关系。比如window和event之间，只有用户事件时两者才会发生关联，当没有事件时两者并不一起工作，他们之间的合作关系是短时间的。我们也不会把event声明为windows的一个属性，而一般在windows的方法里进行处理。</p>
<p>&nbsp;&nbsp;&nbsp; Dependency 还经常用于
表示一种对通用模块（如<tt id="x09a">java.util.regex</tt>
，<tt id="it_o">java.math</tt>
）而非业务模块的依赖关系。这显然是一种问题域（而不是解域或技术角度）的思维角度。</p>
<p><br id="syrk" />
<br id="yg:q" />
<span id="m0qr" style="font-weight: bold;">Association关联:has a</span>
<br id="ejbw" />
<em id="pg04"></em>
</p>
<p>&nbsp;&nbsp;&nbsp; Associations表示类之间的一种持续一段时间的合作关系，但被关联的2者生命线（顺序图的概念）不被绑定（也就是说如果一个类被销毁，另一个类不一定被销毁）。</p>
<p>&nbsp;&nbsp;&nbsp; 在具体实现时往往表示为类的属性。但也不是所有的属性都是Associations，像int/bool这类的属性就不易表示为Associations。</p>
<p>&nbsp;&nbsp;&nbsp; 关联是可以有导航的，就是可以有方向，用带箭头的实线表示。</p>
<p><br id="q:wz" />
<br id="ukcg" />
<span id="un_g" style="font-weight: bold;">Aggregation聚合:</span>
<span class="docEmphasis" id="fcrt" style="font-weight: bold;">owns but may share</span>
<span id="tg-b" style="font-weight: bold;"> </span>
<br id="cdft" />
&nbsp;&nbsp;&nbsp; <span id="jzhq">Aggregation 表示一种owns（拥有）关系，并且</span>
被关联的2者生命线<strong>可能</strong>
被关联。</p>
<p>&nbsp;&nbsp;&nbsp; 在UML规范中对这种关系的定义非常模糊，充斥这也许、可能这类字眼。《UML Distilled》中甚至说&ldquo;聚合是完全没有意义的。因此，我建议，你在自己的的图中略去聚合。&rdquo;</p>
<p><span id="jzhq">&nbsp;&nbsp;&nbsp; 我个人也认为Aggregation 是较难判断的一类关系，很难确切定义它。它的上面association和下面composition的定义都很明确，大概可理解为介于两者之间，但偏composition。</span>
<br id="iij9" />
<br id="dc4g" />
<span id="x7pn" style="font-weight: bold;">Composition组合:is part of</span>
<br id="y4z2" />
</p>
<p>&nbsp;&nbsp;&nbsp; Composition用于表示&ldquo;整体-部分&rdquo;关系。这种关系是&ldquo;非共享&rdquo;的，也就是说，在任何时间，&ldquo;部分&rdquo;只能包含在一个&ldquo;整体&rdquo;中。二者的生命线总是相连的，如果整体被销毁了，部分也就不存在了。</p>
<p>&nbsp;&nbsp;&nbsp; 这里的&ldquo;部分&rdquo;不一定是多个。</p>
<p>&nbsp;&nbsp;&nbsp; 这里要提醒一下，这里的&ldquo;非共享&rdquo;关系指的是实例，而不是类。就是说一个类的不同实例可以属于不同的拥有者，但一个特定的实例只能有一个拥有者。</p>
<p><br id="lpq3" />
<br id="evas" />
<span id="j-eq" style="font-weight: bold;">Generalization 泛化(Otherwise Known as Inheritance):</span>
<span class="docEmphasis" id="k5l9" style="font-weight: bold;">is a type of</span>
</p>
<p>&nbsp;</p>
<p>以上5类关系依赖性由弱到强。</p>
<p><strong>比较常用的是association/composition/generalization</strong>
<span id="jzhq" style="font-weight: bold;"><br id="hgxa" />
<br id="lgrr" />
</span>
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>以下是相关概念的英文表述：</p>
<p><strong>
Dependency</strong>
 between classes means that one class uses, or has knowledge of, 
another class. It is typically a <span id="zk0e" style="font-weight: bold;">transient </span>
relationship, meaning a dependent 
class <span id="r.0o" style="font-weight: bold;">briefly </span>
interacts with the target class but typically doesn't retain a 
relationship with it for any real length of time.</p>
<p>
A dependency implies only that objects of a class <span class="docEmphasis" id="eeuo" style="font-weight: bold;">can</span>
 work together.<br id="c.hd" />
The dependency relationship is often used when you have a class 
that is providing a set of general-purpose utility functions, such as in Java's 
regular expression (<tt id="x09a">java.util.regex</tt>
) and mathematics 
(<tt id="it_o">java.math</tt>
) packages. Classes depend on the <tt id="qvsu">java.util.regex</tt>
 
and <tt id="qdd2">java.math</tt>
 classes to use the utilities that those classes 
offer.</p>
<p>&nbsp;</p>
<p><strong>Associations</strong>
 are stronger than dependencies and typically indicate that 
one class retains a relationship to another class over an extended period of 
time. The lifelines of two objects linked by associations are probably not tied 
together (meaning one can be destroyed without necessarily destroying the 
other).<br id="lg2c" />
<span class="docEmphasis" id="zz_-">Association</span>
 means that a class will actually 
contain a reference to an object, or objects, of the other class in the form of 
an attribute.</p>
<p>&nbsp;</p>
<p><strong>
Aggregation</strong>
 is a stronger version of association. Unlike association,
aggregation typically implies ownership and may imply a relationship
between lifelines.</p>
<p>&nbsp;</p>
<p><strong>
Composition</strong>
 is used to capture a whole-part relationship. The &quot;part&quot; piece of 
the relationship can be involved in only one composition relationship
 at any given time. The lifetime of instances involved 
in composition relationships is almost always linked; if the larger, owning 
instance is destroyed, it almost always destroys the part piece.</p>
<p>&nbsp;</p>
<p>参考文献</p>
<p>1.O'Reilly.Learning.UML.2.0.Apr.2006</p>
<p>2.O'Reilly.UML.2.0.in.a.Nutshell.Jun.2005</p>
<p>3.UML Distilled 3rd edition</p>
<p>4.道法自然：面向对象实践指南</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://mahuangyihao.javaeye.com/blog/186875#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 25 Apr 2008 17:10:43 +0800</pubDate>
        <link>http://mahuangyihao.javaeye.com/blog/186875</link>
        <guid>http://mahuangyihao.javaeye.com/blog/186875</guid>
      </item>
      <item>
        <title>Eclipse使用频率最高的快捷键</title>
        <author>世说新语</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mahuangyihao.javaeye.com">世说新语</a>&nbsp;
          链接：<a href="http://mahuangyihao.javaeye.com/blog/181196" style="color:red;">http://mahuangyihao.javaeye.com/blog/181196</a>&nbsp;
          发表时间: 2008年04月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small;">发过一个快捷键总结被埋了，现在搞个标题党试试。<br />
<br />
代码助手:Ctrl+Space（简体中文操作系统是Alt+/）<br />
快速修正：Ctrl+1<br />
单词补全：Alt+/<br />
打开外部Java文档：Shift+F2</span>
</p>
<p><span style="font-size: small;"><br />
显示搜索对话框：Ctrl+H<br />
快速Outline：Ctrl+O<br />
打开资源：Ctrl+Shift+R<br />
打开类型：Ctrl+Shift+T 显示重构菜单：Alt+Shift+T</span>
</p>
<p><span style="font-size: small;"><br />
上一个/下一个光标的位置：Alt+Left/Right<br />
上一个/下一个成员（成员对象或成员函数）：Ctrl+Shift+Up/Down<br />
选中闭合元素：Alt+Shift+Up/Down/Left/Right<br />
删除行：Ctrl+D<br />
在当前行上插入一行：Ctrl+Shift+Enter<br />
在当前行下插入一行： Shift+Enter<br />
上下移动选中的行：Alt+Up/Down</span>
</p>
<p><span style="font-size: small;"><br />
组织导入：Ctrl+Shift+O<br />
<br />
</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://mahuangyihao.javaeye.com/blog/181196#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Apr 2008 12:32:40 +0800</pubDate>
        <link>http://mahuangyihao.javaeye.com/blog/181196</link>
        <guid>http://mahuangyihao.javaeye.com/blog/181196</guid>
      </item>
      <item>
        <title>Java中线程安全集合的使用小结</title>
        <author>世说新语</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mahuangyihao.javaeye.com">世说新语</a>&nbsp;
          链接：<a href="http://mahuangyihao.javaeye.com/blog/181156" style="color:red;">http://mahuangyihao.javaeye.com/blog/181156</a>&nbsp;
          发表时间: 2008年04月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-family: courier new,courier; font-size: small;"><span style="font-size: x-small;"><em><strong><span style="font-size: medium;">线程安全的集合包含2个问题</span>
</strong>
</em>
<br id="snzt" />
<span style="font-size: small;">
1.多线程并发修改一</span>
<span style="font-size: small;">个</span>
<span style="font-size: small;">
</span>
</span>
</span>
<span style="font-family: courier new,courier; font-size: small;"><span>集合</span>
</span>
<span style="font-family: courier new,courier; font-size: small;"><span>怎么办？</span>
</span>
<span style="font-family: courier new,courier; font-size: small;"><br id="h6rr" />
</span>
<span style="font-family: courier new,courier; font-size: small;"><span>2.如果迭代的过程中</span>
</span>
<span style="font-family: courier new,courier; font-size: small;"><span>集合</span>
</span>
<span style="font-size: small;"><span style="font-size: x-small;"><span style="font-family: courier new,courier; font-size: small;">被修改了怎么办？<br id="hqre" />
&nbsp;&nbsp;&nbsp; a.一个线程在迭代，另一个线程在修改<br id="rmzt" />
&nbsp;&nbsp;&nbsp; b.在同一个线程内用同一个迭代器对象进行迭代、修改、迭代、修改. . . </span>
<br id="blgd" />
</span>
</span>
<span style="font-size: small;">
</span>
</p>
<p class="docText" id="rj4v">&nbsp;</p>
<p class="docText"><span style="font-family: courier new,courier; font-size: small;"><span style="font-size: x-small;"><span style="font-size: medium;"><em><strong><span>共有有3种解决方案</span>
</strong>
</em>
</span>
<br id="it30" />
<span style="font-size: small;">
1.用老的Vector/Hashtable类，上面2个问题都不用担心。<br id="qd71" />
</span>
</span>
</span>
<span style="font-family: courier new,courier; font-size: small;"><span>Vector/Hashtable所提供的所有方法都是</span>
</span>
<span style="font-family: courier new,courier; font-size: small;">synchronized的。如果
</span>
<span style="font-family: courier new,courier; font-size: small;"><span>迭代的过程中数据结构被修改了，迭代器可以反映最新的修改，也不会抛异常。但这种方法效率低下，不建议使用。</span>
<span></span>
</span>
</p>
<p class="docText">&nbsp;</p>
<p class="docText"><span style="font-family: courier new,courier; font-size: small;"><span>2.使用ArrayList/HashMap和同步包装器</span>
</span>
</p>
<p class="docText"><span style="font-family: courier new,courier; font-size: small;">可用</span>
<span style="font-family: courier new,courier; font-size: small;"><span>同步包装器使容器变成线程安全的</span>
</span>
</p>
<pre name="code" class="java">List synchArrayList = Collections.synchronizedList(new ArrayList());<br />
Map synchHashMap = Collections.synchronizedMap(new HashMap())<br />
</pre>
<p><span style="font-family: courier new,courier; font-size: small;">如果要迭代，需要这样</span>
</p>
<pre name="code" class="java">synchronized (synchHashMap)<br />
{<br />
   Iterator iter = synchHashMap.keySet().iterator();<br />
   while (iter.hasNext()) . . .;<br />
}<br />

</pre>
&nbsp;
<p><span style="font-family: courier new,courier; font-size: small;">注意上面的代码每次进入同步块都生成了一个新的迭代器。如果你还用老的迭代器，2b的情况就可能发生，你会收到一个ConcurrentModificationException。</span>
</p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier; font-size: small;">3.用java5.0新加入的ConcurrentLinkedQueue、ConcurrentHashMap、CopyOnWriteArrayList 和 CopyOnWriteArraySet<br />
对这些集合进行并发修改是安全的。针对2b的问题，迭代器既不抛异常，也不会反映新的修改。就是说你迭代的是生成迭代器时的容器，不是最新的容器。</span>
</p>
          <br/>
          <span style="color:red;">
            <a href="http://mahuangyihao.javaeye.com/blog/181156#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Apr 2008 11:25:13 +0800</pubDate>
        <link>http://mahuangyihao.javaeye.com/blog/181156</link>
        <guid>http://mahuangyihao.javaeye.com/blog/181156</guid>
      </item>
      <item>
        <title>Eclipse常用快捷键分类总结</title>
        <author>世说新语</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mahuangyihao.javaeye.com">世说新语</a>&nbsp;
          链接：<a href="http://mahuangyihao.javaeye.com/blog/169213" style="color:red;">http://mahuangyihao.javaeye.com/blog/169213</a>&nbsp;
          发表时间: 2008年03月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-family: courier new,courier; font-size: small;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-size: medium;"><strong>1几个最重要的快捷键</strong>
</span>
</span>
</span>
</span>
</p>
<p><span style="font-family: courier new,courier; font-size: small;">代码助手:Ctrl+Space（简体中文操作系统是Alt+/）<br />
快速修正：Ctrl+1<br />
单词补全：Alt+/<br />
打开外部Java文档：Shift+F2<br />
<br />
显示搜索对话框：Ctrl+H<br />
快速Outline：Ctrl+O<br />
打开资源：Ctrl+Shift+R<br />
打开类型：Ctrl+Shift+T<br />
显示重构菜单：Alt+Shift+T</span>
</p>
<p><span style="font-family: courier new,courier; font-size: small;">上一个/下一个光标的位置：Alt+Left/Right</span>
<span style="font-family: courier new,courier; font-size: small;"><br />
上一个/下一个成员（成员对象或成员函数）：Ctrl+Shift+Up/Down<br />
选中闭合元素：Alt+Shift+Up/Down/Left/Right<br />
删除行：Ctrl+D<br />
在当前行上插入一行：Ctrl+Shift+Enter<br />
在当前行下插入一行： Shift+Enter<br />
上下移动选中的行：Alt+Up/Down</span>
</p>
<p><span style="font-family: courier new,courier; font-size: small;"><br />
组织导入：Ctrl+Shift+O<br />
<br />
</span>
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier; font-size: small;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-size: medium;"><strong>2 定位</strong>

<br />

<span style="font-size: small;"><strong>2.1行内定位</strong>

</span>

</span>

<span style="font-size: small;"><br />

行末/行首：End/Home<br />

前一个/后一个单词：Ctrl+Right/Left<br />

</span>

<span style="font-size: small;"><strong>2.2文件内定位</strong>

<br />

跳到某行：Ctrl+L<br />

上下滚屏：Ctrl+Up/Down<br />

上一个/下一个成员（成员对象或成员函数）：Ctrl+Shift+Up/Down<br />

快速Outline：Ctrl+O</span>

<br />

<span style="font-size: small;"><strong>2.3跨文件定位</strong>

<br />

打开声明：F3<br />

打开资源：Ctrl+Shift+R<br />

打开类型：Ctrl+Shift+T<br />

在workspace中搜索选中元素的声明：Ctrl+G<br />

在workspace中搜索选中的文本：Ctrl+Alt+G<br />

在workspace中搜索选中元素的引用：Ctrl+Shift+G<br />

打开调用层次结构：Ctrl+Alt+H<br />

快速层次结构：Ctrl+T<br />

反悔：Ctrl+Z<br />

<strong>2.4其它</strong>

<br />

上一个/下一个光标所在位置：Alt+Left/Right<br />

上一个编辑的位置：Ctrl+Q</span>

<br />

<span style="font-size: medium;"><strong></strong>

</span>

</span>

</span>

</span>

</p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier; font-size: small;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-size: medium;"><strong>3 选中</strong>

</span>

<br />

<span style="font-size: small;"><strong>3.1行内选中</strong>

<br />

选中到行末/行首：Shift+End/Home<br />

选中上一个/下一个单词：Ctrl+Shift+Left/Right<br />

<strong>3.2文件内选中</strong>

<br />

选中闭合元素：Alt+Shift+Up<br />

恢复到上一个选中：Alt+Shift+Down<br />

选中下一个/上一个元素：Alt+Shift+Right/Left</span>

<br />

<span style="font-size: medium;"><strong></strong>

</span>

</span>

</span>

</span>

</p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier; font-size: small;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-size: medium;"><strong>4 定位/选中/操作同时</strong>

</span>

<br />

<span style="font-size: small;">	删除行：Ctrl+D<br />

	删除下一个/上一个单词：Ctrl+Delete/Backspace<br />

	删除到行末：Ctrl+Shift+Delete<br />

	在当前行上插入一行：Ctrl+Shift+Enter	<br />

	在当前行下插入一行： Shift+Enter<br />

	上下移动选中的行：Alt+Up/Down<br />

	拷贝选中的行：Ctrl+Alt+Up/Down</span>

<br />

<span style="font-size: medium;"><strong></strong>

</span>

</span>

</span>

</span>

</p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier; font-size: small;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-size: medium;"><strong>5其它的代码编辑类快捷键</strong>

</span>

<br />

<span style="font-size: small;">保存：Ctrl+S<br />

保存所有：Ctrl+Shift+S<br />

下一个命中的项（搜索之后）：Ctrl+.<br />

注释：Ctrl+/<br />

添加导入：Ctrl+Shift+M<br />

显示快捷键帮助：Ctrl+Shift+L<br />

变为大/小写：Ctrl+Shift+X/Y</span>

</span>

<span style="font-size: x-small;"><strong></strong>

<span style="font-size: medium;"><strong></strong>

</span>

</span>

</span>

</span>

</p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier; font-size: small;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-size: medium;"><strong>6 重构</strong>

</span>

<br />

<span style="font-size: small;">显示重构菜单：Alt+Shift+T<br />

重构-改变方法签名：Alt+Shift+C<br />

重构-移动：Alt+Shift+V<br />

重构-重命名：Alt+Shift+R</span>

<br />

<span style="font-size: medium;"><strong></strong>

</span>

</span>

</span>

</span>

</p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier; font-size: small;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-size: medium;"><strong>7 编辑器、视图、透视图切换</strong>

</span>

<br />

<span style="font-size: small;">下一个编辑器：Ctrl+F6<br />

下一个视图：Ctrl+F7<br />

下一个透视图：Ctrl+F8<br />

最大化当前视图或编辑器：Ctrl+M<br />

激活编辑器：F12</span>

<br />

<span style="font-size: medium;"><strong></strong>

</span>

</span>

</span>

</span>

</p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier; font-size: small;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-size: medium;"><strong>8 Debug</strong>

</span>

<br />

<span style="font-size: small;">F5：Step Into（debug）<br />

F6：Step over（debug）<br />

F7：Step return（debug）<br />

F8：Resume（debug）<br />

F11：debug上一个应用（debug）</span>

<br />

<span style="font-size: medium;"><strong></strong>

</span>

</span>

</span>

</span>

</p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier; font-size: small;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-size: medium;"><strong>9 Up/Down/Right/Left类快捷键</strong>

</span>

<br />

<span style="font-size: small;">Ctrl<br />

前一个/后一个单词：Ctrl+Right/Left<br />

上下滚屏：Ctrl+Up/Down<br />

Alt<br />

上一个/下一个光标的位置：Alt+Left/Right<br />

上下移动选中的行：Alt+Up/Down<br />

Shift<br />

	选中上一个/下一个字符：Shift+Left/Right<br />

	选中上一行/下一行（从当前光标位置开始）：Shift+Up/Down<br />

Ctrl+Shift<br />

上一个/下一个成员（成员对象或成员函数）：Ctrl+Shift+Up/Down<br />

选中上一个/下一个单词：Ctrl+Shift+Left/Right<br />

Alt+Shift<br />

选中闭合元素：Alt+Shift+Up<br />

恢复到上一个选中：Alt+Shift+Down<br />

选中下一个/上一个元素：Alt+Shift+Right/Left<br />

		拷贝选中的行：Ctrl+Alt+Up/Down<br />

	Ctrl+Alt<br />

		拷贝选中的行：Ctrl+Alt+Up/Down</span>

<br />

<span style="font-size: medium;"><strong></strong>

</span>

</span>

</span>

</span>

</p>
<p>&nbsp;</p>
<p><span style="font-family: courier new,courier; font-size: small;"><span style="font-size: small;"><span style="font-size: x-small;"><span style="font-size: medium;"><strong>10 F类快捷键</strong>

</span>

<br />

<span style="font-size: small;">F2：显示提示/重命名<br />

F3：打开选中元素的声明<br />

F4：打开选中元素的类型继承结构<br />

F5：刷新<br />

F5：Step Into（debug）<br />

F6：Step over（debug）<br />

F7：Step return（debug）<br />

F8：Resume（debug）<br />

F11：debug上一个应用（debug）<br />

F12：激活编辑器<br />

</span>

</span>

</span>

</span>

</p>
<p><span style="font-family: courier new,courier; font-size: small;"><span style="font-size: small;"><span style="font-size: x-small;">&nbsp;</span>

</span>

</span>

</p>
          <br/>
          <span style="color:red;">
            <a href="http://mahuangyihao.javaeye.com/blog/169213#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 07 Mar 2008 18:21:12 +0800</pubDate>
        <link>http://mahuangyihao.javaeye.com/blog/169213</link>
        <guid>http://mahuangyihao.javaeye.com/blog/169213</guid>
      </item>
      <item>
        <title>多读代码少看书</title>
        <author>世说新语</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mahuangyihao.javaeye.com">世说新语</a>&nbsp;
          链接：<a href="http://mahuangyihao.javaeye.com/blog/169212" style="color:red;">http://mahuangyihao.javaeye.com/blog/169212</a>&nbsp;
          发表时间: 2008年03月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.实践<br />计算机是一门实践的学科，提高技术水平也应该选择最贴近实践的方法——自己写或者看别人写。我不是反对看技术书，但真正值得细读的技术书非常少，市面上计算机图书汗牛充栋，这个是经典、那个是大师、另一个又是必读，很容易误导初学者。事实上对国内大量在一线的程序员来说（专业项目管理、需求分析、测试等其它工种除外）在真正必读的书我认为只有2本——《代码大全》和《设计模式》（这里指的是讲设计模式的书，相对于Gof的这本，我更推荐《敏捷软件开发：原则、模式与实践》），剩下的时间都应该用在写代码和读代码上面。编程涉及到很多细节上的东西，比如变量和方法的命名、方法的粒度、注释的写法、经典模式的变体等等，而这些东西在书里是不会有的。所以靠看书是成不了好的程序员的，这个方面我走过弯路，希望大家不要再走了。如果有一天你发现自己读书的时间多于读代码和写代码的时间，你就要小心了，在成为优秀程序员这条路上，你已经走到岔道里去了。<br />2.不要重复发明轮子<br />老程序员有个特点，就是代码写的很快，有的时候甚至快得不可思议，让新手目瞪口呆。我们常说“不要重复发明轮子”，但一般的理解是对已有的专业代码库的重用，事实上在具体的类、方法的层次，甚至是语句的层次都可以实现代码重用。因为并不是所有的代码都会被抽象整理为公用的代码库的，一些很细节的东西是不会有的，而程序员每天面对的正是一个个具体的、细粒度的问题；而且限于一些开源协议的规定，也不是什么库都能随便搞拿来主义的。解决这个问题的方法就是建立自己的代码库，多读代码，多写代码，把自己认为好的、具有一定通用性的代码整理出来，如此日积月累，最后大量的工作都是通过拷贝/粘贴已有代码来完成的，真正要创造的很少。我们可以把更多的精力放在局部代码结构的设计上，写代码的速度会越来越快，而且因为已有代码都是实际应用中千锤百炼的结晶，代码的质量也会约来越高。
          <br/>
          <span style="color:red;">
            <a href="http://mahuangyihao.javaeye.com/blog/169212#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 07 Mar 2008 18:17:38 +0800</pubDate>
        <link>http://mahuangyihao.javaeye.com/blog/169212</link>
        <guid>http://mahuangyihao.javaeye.com/blog/169212</guid>
      </item>
  </channel>
</rss>