﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-过去一切皆是梦，梦醒后又是万里晴空</title><link>http://www.blogjava.net/mengqing/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 00:23:29 GMT</lastBuildDate><pubDate>Thu, 07 May 2026 00:23:29 GMT</pubDate><ttl>60</ttl><item><title>java eclipse中的重构</title><link>http://www.blogjava.net/mengqing/archive/2011/11/15/363795.html</link><dc:creator>梦晴</dc:creator><author>梦晴</author><pubDate>Tue, 15 Nov 2011 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/mengqing/archive/2011/11/15/363795.html</guid><wfw:comment>http://www.blogjava.net/mengqing/comments/363795.html</wfw:comment><comments>http://www.blogjava.net/mengqing/archive/2011/11/15/363795.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mengqing/comments/commentRss/363795.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mengqing/services/trackbacks/363795.html</trackback:ping><description><![CDATA[<p align="left"><strong><span style="font-family: 宋体; font-size: 13.5pt"><a href="http://ldzyz007.iteye.com/blog/1157139"><span style="color: blue">eclipse</span><span style="color: blue">重构详解</span></a> </span></strong></p>
<p style="text-align: left; margin: 0cm 0cm 0pt 36pt" align="left"><strong><span style="font-family: 宋体; font-size: 12pt">博客分类：</span></strong><span style="font-family: 宋体; font-size: 12pt"> </span></p>
<ul type="disc"><li style="text-align: left"><span style="font-family: 宋体; font-size: 12pt"><a href="http://ldzyz007.iteye.com/category/101909"><span style="color: blue">eclipse</span></a></span></li><li style="text-align: left"><span style="font-family: 宋体; font-size: 12pt"><a href="http://ldzyz007.iteye.com/category/102571"><span style="color: blue">java</span></a></span></li></ul>
<p align="left"><span style="font-family: 宋体; font-size: 12pt"><a href="http://www.iteye.com/blogs/tag/eclipse"><span style="color: blue">eclipse</span></a><a href="http://www.iteye.com/blogs/tag/refactoring"><span style="color: blue">refactoring</span></a></span></p>
<p align="left"><span style="font-family: 宋体; font-size: 12pt">重构是对软件内部结构的一种调整，目的是在不改变软件行为的前提下，提高其可理解性，降低其修改成本。开发人员可以使用一系列重构准则，在不改变软件行为的前提下，调整软件的结构。 <br /><br />有很多种原因，开发人员应该重构代码，例如之前的开发人员代码写得很烂、自己以前设计时有缺陷、需求变更需要添加一些新的功能或修改原有功能等等。Martin Fowler在其著名的&lt;&lt;Refactoring&#8212;Improving the Design of Existing Code&gt;&gt;一书中谈到了为何重构的几点原因： <br /><br />1. 重构可以改进软件设计 <br /><br />如果不进行重构，程序的设计会变得越来越糟糕。通常程序员只为短期的目的，或者在没有完全理解整体设计的时候，就开始修改代码，这样程序将会逐渐失去自己的结构，程序员也愈来愈难通过阅读源码理解原本设计，相信对此每一个开发人员都深有体会。 <br /><br />代码结构的流失是累积性的，愈难看出代码所代表的意思，就越难保护其中的设计，于是设计也将变得越来越糟糕，经常性重构可以帮助维持设计该有的形态。 <br /><br />2. 重构使软件更易被理解 <br /><br />很多开发人员认为代码只要能够运行起来就可以了，笔者刚开始做开发的时候也是这么认为的，也写过很多的垃圾代码，也因此吃了不少苦头。 <br /><br />也许有些人可能会认为自己可能不久就会离开所在的职位，不必在意代码的质量，但作为一个开发人员来说，写出漂亮的代码是最基本的素质。 <br /><br />在软件的不断修改过程中，代码的可读性越来越差也是会慢慢累积的，但这不要紧，只要记得持续重构，就能使自己的代码更容易被理解。 <br /><br />3. 重构可以协助找到Bugs <br /><br />对代码的理解，可以更容易找到bug，在重构的同时，也能够更好的理解代码及其行为，从而通过重构能够帮助开发人员写出更强壮的代码。 <br /><br />4. 重构可以提高编程的速度 <br /><br />良好的设计是快速软件开发的根本，如果没有良好的设计，也许开始的一段时间开发人员的进展迅速，但是恶劣的设计很快就会使开发速度慢下来。也许把时间花在调试上的时间会越来越多，修改的时间会越来越长，而且这会是一个恶性的循环。 <br />良好的设计是维持软件开发速度的根本，重构可以帮助开发人员更快速地开发软件，因为它能够阻止系统的设计变质，能够提高代码的可读性。 <br /><br />使用Eclipse进行代码重构 <br /><br />重构是软件开发过程中保证代码质量非常重要的手段，而手动进行重构代码的话，很容易引入一些低级错误（例如，单词拼写错误），从而导致浪费大量不必要的时间。Eclipse为重构提供了很强大的支持，很大程度上用户不必为重构的笔误而再烦恼。 <br />在Eclipse中，可以使用JDT提供的重构功能对Java项目、类和其成员进行重构，所有这些被重构的部分都可以看成一个JDT能识别的Java元素。要执行重构，首先必须选择相应重构的Java元素，一些重构是适合任何Java元素的，而一部分重构只适合特定的Java元素，几乎所有的重构都能够在重构对话框中看到预览的效果。 <br /><br />要使用Eclipse的重构功能，可以先选择相应的Java元素（Java工程中的资源，包括工程、文件、方法、变量等），通过右键菜单选择Refactor菜单下的重构功能，如图1所示。 <br /><br /><span><br /><br /><br /></span>图1 选择重构菜单 <br /><br /><br />在Eclipse中，可以简单的把重构分为结构性重构、类级别重构和类内部重构，每种类型的重构又分别包含了一些具体的实现，接下来将分别介绍Eclipse如何对Java元素进行重构。 <br /><br />提示：在JDT可识别的范围内，可以认为工程中资源都是Java元素，包括Java文件名、类、方法、变量等。 <br /><br />结构性重构 <br /><br />结构性重构涉及到JAVA元素的物理结构的改变，包括&#8220;Rename&#8221;、&#8220;Move&#8221;、&#8220;Change Method Signature&#8221;、&#8220;Convert Anonymous Class to Nested&#8221;和&#8220;Move Member Type to New File&#8221;，下面将一一介绍这些重构在Eclipse中的实现。 <br /><br />1. Rename <br /><br />Rename重构的功能就是重命名Java元素。虽然可以通过手动修改文件的文件名或其它Java元素的名称，但这种方式不会更新与此Java元素相关联的引用，用户必须手动查找和此Java元素相关的位置，然后进行手动修改。通过手动修改名称的方式，造成笔误的可能性会太太增加。通过Eclipse提供的Rename的功能，Eclipse会自动完成更新相关引用的操作。 <br />当Java元素的命名不清晰或功能发生改变的时，为了保持代码的可读性，可以通过Eclipse的重构功能重命名Java元素。选择相应的Java元素，选择右键Refactor菜单下的Rename菜单，可以对当前选择的元素进行重命名，在弹出的重命名对话框中修改相应的元素名称即可，例如修改一个包的重命名，如图2所示。 <br /><br /><br /><br /><br />图2 Rename对话框 <br /><br /><br />要修改包名的同时，可以选择是否更新引用和更新子目录，甚至是非Java文件也可以选择性的更新。选择Preview按钮可以预览重命名重构后的效果，如图3所示。 <br /><br /><br /><br /><br />图3 预览重命名包名 <br /><br />可以查看预览的内容是否一致，确认是否要进行重命名的重构。可以进行重命名的Java元素有Java项目、Java文件、包、方法和属性字段等。 <br /><br />提示：非Java项目和Java文件等也可以通过重构菜单的Rename进行重命名。 <br /><br />2. Move <br /><br />Move的重构和Rename的重构类似，它可以把一个Java元素从一个地方移动到另一个地方，Move的重构主要用来移动一个类到不同的包下。首先选中一个Java文件，选择Refactor菜单下的Move菜单项，弹出Move的重构对话框，如图4所示。 <br /><br /><br /><br />图4 Move对话框 <br /><br /><br />可以选择是否更新引用，设定移动文件重构的一些参数。 <br /><br />提示：也可以通过拖动的方式把一个文件从一个包移动到另一个包，实现移动文件的重构。 <br /><br />3. Change Method Signature <br /><br />&#8220;Change Method Signature&#8221;重构的功能是改变方法的定义，例如改变方法的参数名称、类型和个数、返回值的类型，方法的可见性以及方法的名称等。 <br /><br />要改变方法的定义，可以先选择方法，通过右键菜单选择Refactor菜单的&#8220;Change Method Signature&#8221;子菜单项，弹出&#8220;Change Method Signature&#8221;对话框，如图5所示。 <br /><br /><br /><br /><br />图5 &#8220;Change Method Signature&#8221;对话框 <br /><br /><br />可以通过&#8220;Change Method Signature&#8221;对话框改变方法的参数名称、类型和个数、返回值的类型，方法的可见性以及方法名称等。 <br /><br />4. Convert Anonymous Class to Nested <br /><br />&#8220;Convert Anonymous Class to Nested&#8221;重构的功能是把匿名类改成内部类，这样同一个类的其它部分也可以共享此类了。 <br />例如有例程1所示的类。 <br /><br />例程1 KeyListenerExample.java <br /><br />public class KeyListenerExample { Display display; Shell shell; KeyListenerExample() { display = new Display(); shell = new Shell(display); shell.setSize(250, 200); shell.setText("A KeyListener Example"); Text text = new Text(shell, SWT.BORDER); text.setBounds(50, 50, 100, 20); text.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { System.out.println("key Pressed -" + e.character); } public void keyReleased(KeyEvent e) { System.out.println("key Released -" + e.character); } }); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } public static void main(String[] args) { new KeyListenerExample(); } } <br /><br />在KeyListenerExample类有一个匿名类，实现了KeyListener接口，可以把这个匿名类改成内部类，首先选择匿名类，右键选择Refactor的&#8220;Convert Anonymous Class to Nested&#8221;菜单，输入内部类的名称，如图6所示。 <br /><br /><br /><br /><br />图6 &#8220;Convert Anonymous Class to Nested&#8221;对话框 <br /><br /><br />重构后的结果是Eclipse为此创建了一个内部类，名称为TestKeyListener，重构后的代码如例程2所示。 <br />例程2 重构后的KeyListenerExample.java <br /><br />public class KeyListenerExample { private final class TestKeyListener implements KeyListener { public void keyPressed(KeyEvent e) { System.out.println("key Pressed -" + e.character); } public void keyReleased(KeyEvent e) { System.out.println("key Released -" + e.character); } } Display display; Shell shell; KeyListenerExample() { display = new Display(); shell = new Shell(display); shell.setSize(250, 200); shell.setText("A KeyListener Example"); Text text = new Text(shell, SWT.BORDER); text.setBounds(50, 50, 100, 20); text.addKeyListener(new TestKeyListener()); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } public static void main(String[] args) { new KeyListenerExample(); } } <br /><br />也可以通过&#8220;Convert Anonymous Class to Nested&#8221;对话框定义新生成的内部类的可访问性。 <br /><br />5. Move Member Type to Top Level <br /><br />通过&#8220;Move Member Type to Top Level&#8221;的重构方式，可以把内部类改成非内部类，并且重新创建一个新的文件，这样其它的类就可以共享此类。 <br /><br />例程2创建了一个内部类TestKeyListener，现在可以通过&#8220;Move Member Type to Top Level&#8221;重构的方式，把TestKeyListener放入一个单独的类中。首先选择TestKeyListener类，从右键菜单Refactor中选择&#8220;Move Member Type to Top Level&#8221;，打开&#8220;Move Member Type to Top Level&#8221;对话框，如图7所示。 <br /><br /><br /><br /><br />图7 &#8220;Move Member Type to Top Level&#8221;对话框 <br /><br /><br />通过上面&#8220;Move Member Type to Top Level&#8221;重构，可以把内部类改成非内部类。 <br /><br />提示：有些时候，重构并不是一步完成的，可以一步一步重构，例如，首先把匿名类改成内部类，再接着把内部类改成非内部类。 <br /><br /><br />类级别重构 <br /><br />类级别重构有如下一些： <br /><br />1. Push Down <br /><br />&#8220;Push Down&#8221;重构功能是把父类的方法和属性移动到所有的子类中，父类的方法可以选择性的保留抽象方法。首先选择父类，右键选择Refactor菜单的&#8220;Push Down&#8221;菜单项，可以通过&#8220;Push Down&#8221;对话框选择重构，如图8所示。 <br /><br /><br /><br /><br />图8 &#8220;Push Down&#8221;对话框 <br /><br /><br />&#8220;Push Down&#8221;重构在重新设计类的时候是非常有用的，它可以比较有较的改善类的继承关系，清楚定义类的行为。 <br /><br />2. Pull Up <br /><br />&#8220;Pull Up&#8221;重构和&#8220;Push Down&#8221;重构正好相反，它的作用是把方法和属性移动到其父类中去。选择需要重构的子类，从右键菜单选择Refactor菜单的&#8220;Pull up&#8221;菜单项，通过&#8220;Pull Up&#8221;对话框进行重构，如图9所示。 <br /><br /><br /><br /><br />图9 &#8220;Pull Up&#8221;对话框 <br /><br /><br />提示：&#8220;Pull Up&#8221;重构和&#8220;Push Down&#8221;重构后可能会出错，在使用此重构的同时，应该先弄清楚某些方法中是否有引用到其它方法或属性。 <br /><br />3. Extract Interface <br /><br />&#8220;Extract Interface&#8221;重构能够从一个已存在的类中提取接口，它可以从某个类中选择方法，把这些方法提取到一个单独的接口中。选择提取接口的类，右键选择Refactor菜单的&#8220;Extract Interface&#8221;菜单项，打开&#8220;Extract Interface&#8221;对话框，如图10所示。 <br /><br /><br /><br /><br />图10 &#8220;Extract Interface&#8221;对话框 <br /><br /><br />单元OK按钮，将会提取TestInterface的接口，提取接口后，当前选择的类将会实现此接口。 <br /><br />提示：只有公用方法才可以被提取为接口的方法。 <br /><br />4. Generalize Declared Type <br /><br />&#8220;Generalize Declared Type&#8221;重构能够改变变量、参数、属性以及函数的返回值的类型，可以把这些类型改成其父类的类型。在Refactor菜单中选择&#8220;Generalize Declared Type&#8221;，如图11所示。 <br /><br /><br /><br /><br />图11 &#8220;Generalize Declared Type&#8221;对话框 <br /><br /><br />单击OK按钮，能够把声明的类型改成当对话框中选择的类型。 <br /><br />5. User Supertype Where Possible <br /><br />&#8220;User Supertype Where Possible&#8221;重构能够用某一个类的父类的类型替换当前类的类型，选择需要被替换引用的类。在Refactor菜单中选择&#8220;User Supertype Where Possible&#8221;打开&#8220;User Supertype Where Possible&#8221;对话框，如图12所示。 <br /><br /><br /><br /><br />图12 &#8220;User Supertype Where Possible&#8221;对话框 <br /><br /><br />&#8220;Generalize Declared Type&#8221;重构和&#8220;User Supertype Where Possible&#8221;重构在面向接口编程方面是很有用的，可以把引用的对象尽可能用接口进行实现。 <br /><br />提示：&#8220;User Supertype Where Possible&#8221;重构将替换其它类中的引用，要想看到重构的效果，应该找到其它类引用的位置，此操作不会修改当前文件。 <br /><br /><br />类内部重构 <br /><br />类内部重构有如下一些： <br /><br />1. Inline <br /><br />&#8220;Inline&#8221;重构能用函数的内容替换掉函数的引用。首先选择函数的引用，在Refactor菜单中选择&#8220;Inline&#8221;打开&#8220;Inline&#8221;对话框，如图13所示。 <br /><br /><br /><br />图13 &#8220;Inline&#8221;对话框 <br /><br /><br />单击确定按钮，Eclipse将会用方法实现的部分替换引用的部分，即当前不采用方法调用的方式进行操作。也可以选择&#8220;All invocations&#8221;和&#8220;Delete method declaration&#8221;，Eclipse会替换掉所有引用方法的位置，并且删除方法。 <br /><br />提示：Inline会用方法的实现部分替换所有调用方法的地方。 <br /><br />2. Extract Method <br /><br />&#8220;Extract Method&#8221;重构和&#8220;Inline&#8221;重构相反，它能够从冗长的方法中提取小的方法，把大的方法分解成多个小方法来实现，通过此重构能够使代码看上去更简单漂亮，也很大程度上提高代码的复用性。可以选择要提取方法的代码，在Refactor菜单中选择&#8220;Extract Method&#8221;打开&#8220;Extract Method&#8221;对话框，如图14所示。 <br /><br /><br /><br /><br />图14 &#8220;Extract Method&#8221;对话框 <br /><br /><br />&#8220;Extract Method&#8221;重构是非常好的重构方式，能够把大的方法体重构成多个方法的实现，使代码更清楚易懂。 <br /><br />提示：&#8220;Extract Method&#8221;重构和&#8220;Inline&#8221;重构是对应的，有些时候为了组织一些不合的函数，可以先通过&#8220;Inline&#8221;的方式生成一个大的函数，再通过&#8220;Extract Method&#8221;来重构大的函数，使代码更趋于合理。 <br /><br />3. Extract Local Variable <br /><br />在开发过程中，使用变量代替表达式是非常好的，这样能使代码更容易被理解。Eclipse中可以通过&#8220;Extract Local Variable&#8221;重构实现提取局部的表达式。首先选择表达式，在Refactor菜单中选择&#8220;Extract Local Variable&#8221;打开&#8220;Extract Local Variable&#8221;对话框，如图15所示。 <br /><br /><br /><br />图15 &#8220;Extract Local Variable&#8221;对话框 <br /><br /><br />4. Extract Constant <br /><br />&#8220;Extract Constant&#8221;重构和&#8220;Extract Local Variable&#8221;重构类似，它可以把表达式定义为常量，另外&#8220;Extract Constant&#8221;重构能够设定常量的可见性。选择表达式，在Refactor菜单中选择&#8220;Extract Constant&#8221;打开&#8220;Extract Constant&#8221;对话框，如图16所示。 <br /><br /><br /><br />图16 &#8220;Extract Constant&#8221;对话框 <br /><br /><br />5. Introduce Parameter <br /><br />&#8220;Introduce Parameter&#8221;重构可以通过函数中的表达式、变量或引用为函数添加新的参数，还能够自动更新引用此函数的其它位置的默认参数。要想进行&#8220;Introduce Parameter&#8221;重构，可以选择表达式、变量或引用。在Refactor菜单中选择&#8220;Introduce Parameter&#8221;打开&#8220;Introduce Parameter&#8221;对话框，如图17所示。 <br /><br /><br /><br /><br />图17 &#8220;Introduce Parameter&#8221;对话框 <br /><br /><br />6. Introduce Factory <br /><br />&#8220;Introduce Factory&#8221;重构能够为类创建工厂方法。首先选择需要创建工厂方法的类的构造函数，在Refactor菜单中选择&#8220;Introduce Factory&#8221;打开&#8220;Introduce Factory&#8221;对话框，如图18所示。 <br /><br /><br /><br /><br />图18 &#8220;Introduce Factory&#8221;对话框 <br /><br /><br />在&#8220;Introduce Factory&#8221;对话框中，可以输入工厂方法的名字，以及工厂类，Eclipse将会自动根据构造函数创建工厂方法。 <br />提示：工厂类应该已经存在，通常可以在一个工厂类中为多个关联的类创建工厂方法，所以在使用&#8220;Introduce Factory&#8221;重构前，应该先创建好工厂类。 <br /><br />7. Convert Local Variable to Field <br /><br />&#8220;Convert Local Variable to Field&#8221;重构能够把局部的变量转换成类中的全局变量。首先选择要转换的局部变量，在Refactor菜单中选择&#8220;Convert Local Variable to Field&#8221;打开&#8220;Convert Local Variable to Field&#8221;对话框，如图19所示。 <br /><br /><br /><br /><br />图19 &#8220;Convert Local Variable to Field&#8221;对话框 <br /><br /><br />在&#8220;Convert Local Variable to Field&#8221;对话框中，还能够修改变量的名称以及变量的可见性。 <br /><br />8. Encapsulate Field <br /><br />&#8220;Encapsulate Field&#8221;重构能够包装属性的可访问性，以及生成访问的方法。首先选择要包装的属性，在Refactor菜单中选择&#8220;Encapsulate Field&#8221;打开&#8220;Encapsulate Field&#8221;对话框，如图20所示。 <br /><br /><br /><br /><br />图20 &#8220;Encapsulate Field&#8221;对话框 <br /><br /><br />通常通过&#8220;Encapsulate Field&#8221;可以生成get和set方法。在&#8220;Encapsulate Field&#8221;对话框中可以输入属性的访问方法的名称，以及方法生成的位置和方法的可见性。 <br /><br />提示：通过右键菜单的Source菜单也能生成相应的get和set方法。 <br /><br />Undo and Redo <br /><br />Eclipse的自动重构功能能够很好的支持各种程序元素的重命名，并自动更新相关的引用。Eclipse能够支持方法、字段在类之间移动，并自动更新引用，较好地支持内联字段、函数的更新替换，较好地支持抽取方法、变量等程序元素。 <br /><br />重构的过程是一个不断尝试和探索的过程。Eclipse的重构支持撤销和重做，并且能够预览重构结果，这些是很实用的功能。要想执行撤消和重做（Undo and Redo）的功能，可以直接按快捷键Ctrl+Z以及Ctrl+Y，也可以选择Edit菜单的Undo和Redo操作。 <br /><br />提示：虽然Eclipse对重构提供了很强大的支持，但是重构后代码的测试是必不可少的，而且不能指望Eclipse能够解决所有重构的问题，有些时候手动重构还是必须的。自动重构的理念应该是&#8220;工具辅助下的重构工作&#8221;，但开发人员仍然承担很大一部分重构工作。</span></p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/mengqing/aggbug/363795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mengqing/" target="_blank">梦晴</a> 2011-11-15 10:30 <a href="http://www.blogjava.net/mengqing/archive/2011/11/15/363795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>