- 浏览: 715078 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
cuqing:
laogao598599 写道匿名内部类不一定是局部内部类,还 ...
匿名内部类访问外部类中的局部变量必须是final属性 -
laogao598599:
匿名内部类不一定是局部内部类,还可以作为成员变量
匿名内部类访问外部类中的局部变量必须是final属性 -
stand_star:
非常给力!
struts2验证规则配置文件命名方式 -
wenlongsust:
嗯, 将返回值修改为html的确就可以了
EasyUI form ajax submit后,在IE下提示下载内容的解决办法 -
勇往直前wwt:
这样是自动增长,但每次id还得插入,如何只插入其他字段而让id ...
把主键定义为自动增长标识符类型
重构是对软件内部结构的一种调整,目的是在不改变软件行为的前提下,提高其可理解性,降低其修改成本。开发人员可以使用一系列重构准则,在不改变软件行为的前提下,调整软件的结构。
有很多种原因,开发人员应该重构代码,例如之前的开发人员代码写得很烂、自己以前设计时有缺陷、需求变更需要添加一些新的功能或修改原有功能等等。Martin Fowler在其著名的<<Refactoring—Improving the Design of Existing Code>>一书中谈到了为何重构的几点原因:
1. 重构可以改进软件设计
如果不进行重构,程序的设计会变得越来越糟糕。通常程序员只为短期的目的,或者在没有完全理解整体设计的时候,就开始修改代码,这样程序将会逐渐失去自己的结构,程序员也愈来愈难通过阅读源码理解原本设计,相信对此每一个开发人员都深有体会。
代码结构的流失是累积性的,愈难看出代码所代表的意思,就越难保护其中的设计,于是设计也将变得越来越糟糕,经常性重构可以帮助维持设计该有的形态。
2. 重构使软件更易被理解
很多开发人员认为代码只要能够运行起来就可以了,笔者刚开始做开发的时候也是这么认为的,也写过很多的垃圾代码,也因此吃了不少苦头。
也许有些人可能会认为自己可能不久就会离开所在的职位,不必在意代码的质量,但作为一个开发人员来说,写出漂亮的代码是最基本的素质。
在软件的不断修改过程中,代码的可读性越来越差也是会慢慢累积的,但这不要紧,只要记得持续重构,就能使自己的代码更容易被理解。
3. 重构可以协助找到Bugs
对代码的理解,可以更容易找到bug,在重构的同时,也能够更好的理解代码及其行为,从而通过重构能够帮助开发人员写出更强壮的代码。
4. 重构可以提高编程的速度
良好的设计是快速软件开发的根本,如果没有良好的设计,也许开始的一段时间开发人员的进展迅速,但是恶劣的设计很快就会使开发速度慢下来。也许把时间花在调试上的时间会越来越多,修改的时间会越来越长,而且这会是一个恶性的循环。
良好的设计是维持软件开发速度的根本,重构可以帮助开发人员更快速地开发软件,因为它能够阻止系统的设计变质,能够提高代码的可读性。
使用Eclipse进行代码重构
重构是软件开发过程中保证代码质量非常重要的手段,而手动进行重构代码的话,很容易引入一些低级错误(例如,单词拼写错误),从而导致浪费大量不必要的时间。Eclipse为重构提供了很强大的支持,很大程度上用户不必为重构的笔误而再烦恼。
在Eclipse中,可以使用JDT提供的重构功能对Java项目、类和其成员进行重构,所有这些被重构的部分都可以看成一个JDT能识别的Java元素。要执行重构,首先必须选择相应重构的Java元素,一些重构是适合任何Java元素的,而一部分重构只适合特定的Java元素,几乎所有的重构都能够在重构对话框中看到预览的效果。
要使用Eclipse的重构功能,可以先选择相应的Java元素(Java工程中的资源,包括工程、文件、方法、变量等),通过右键菜单选择Refactor菜单下的重构功能,如图1所示。
图1 选择重构菜单
在Eclipse中,可以简单的把重构分为结构性重构、类级别重构和类内部重构,每种类型的重构又分别包含了一些具体的实现,接下来将分别介绍Eclipse如何对Java元素进行重构。
提示:在JDT可识别的范围内,可以认为工程中资源都是Java元素,包括Java文件名、类、方法、变量等。
结构性重构
结构性重构涉及到JAVA元素的物理结构的改变,包括“Rename”、“Move”、“Change Method Signature”、“Convert Anonymous Class to Nested”和“Move Member Type to New File”,下面将一一介绍这些重构在Eclipse中的实现。
1. Rename
Rename重构的功能就是重命名Java元素。虽然可以通过手动修改文件的文件名或其它Java元素的名称,但这种方式不会更新与此Java元素相关联的引用,用户必须手动查找和此Java元素相关的位置,然后进行手动修改。通过手动修改名称的方式,造成笔误的可能性会太太增加。通过Eclipse提供的Rename的功能,Eclipse会自动完成更新相关引用的操作。
当Java元素的命名不清晰或功能发生改变的时,为了保持代码的可读性,可以通过Eclipse的重构功能重命名Java元素。选择相应的Java元素,选择右键Refactor菜单下的Rename菜单,可以对当前选择的元素进行重命名,在弹出的重命名对话框中修改相应的元素名称即可,例如修改一个包的重命名,如图2所示。
图2 Rename对话框
要修改包名的同时,可以选择是否更新引用和更新子目录,甚至是非Java文件也可以选择性的更新。选择Preview按钮可以预览重命名重构后的效果,如图3所示。
图3 预览重命名包名
可以查看预览的内容是否一致,确认是否要进行重命名的重构。可以进行重命名的Java元素有Java项目、Java文件、包、方法和属性字段等。
提示:非Java项目和Java文件等也可以通过重构菜单的Rename进行重命名。
2. Move
Move的重构和Rename的重构类似,它可以把一个Java元素从一个地方移动到另一个地方,Move的重构主要用来移动一个类到不同的包下。首先选中一个Java文件,选择Refactor菜单下的Move菜单项,弹出Move的重构对话框,如图4所示。
图4 Move对话框
可以选择是否更新引用,设定移动文件重构的一些参数。
提示:也可以通过拖动的方式把一个文件从一个包移动到另一个包,实现移动文件的重构。
3. Change Method Signature
“Change Method Signature”重构的功能是改变方法的定义,例如改变方法的参数名称、类型和个数、返回值的类型,方法的可见性以及方法的名称等。
要改变方法的定义,可以先选择方法,通过右键菜单选择Refactor菜单的“Change Method Signature”子菜单项,弹出“Change Method Signature”对话框,如图5所示。
图5 “Change Method Signature”对话框
可以通过“Change Method Signature”对话框改变方法的参数名称、类型和个数、返回值的类型,方法的可见性以及方法名称等。
4. Convert Anonymous Class to Nested
“Convert Anonymous Class to Nested”重构的功能是把匿名类改成内部类,这样同一个类的其它部分也可以共享此类了。
例如有例程1所示的类。
例程1 KeyListenerExample.java
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(); } }
在KeyListenerExample类有一个匿名类,实现了KeyListener接口,可以把这个匿名类改成内部类,首先选择匿名类,右键选择Refactor的“Convert Anonymous Class to Nested”菜单,输入内部类的名称,如图6所示。
图6 “Convert Anonymous Class to Nested”对话框
重构后的结果是Eclipse为此创建了一个内部类,名称为TestKeyListener,重构后的代码如例程2所示。
例程2 重构后的KeyListenerExample.java
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(); } }
也可以通过“Convert Anonymous Class to Nested”对话框定义新生成的内部类的可访问性。
5. Move Member Type to Top Level
通过“Move Member Type to Top Level”的重构方式,可以把内部类改成非内部类,并且重新创建一个新的文件,这样其它的类就可以共享此类。
例程2创建了一个内部类TestKeyListener,现在可以通过“Move Member Type to Top Level”重构的方式,把TestKeyListener放入一个单独的类中。首先选择TestKeyListener类,从右键菜单Refactor中选择“Move Member Type to Top Level”,打开“Move Member Type to Top Level”对话框,如图7所示。
图7 “Move Member Type to Top Level”对话框
通过上面“Move Member Type to Top Level”重构,可以把内部类改成非内部类。
提示:有些时候,重构并不是一步完成的,可以一步一步重构,例如,首先把匿名类改成内部类,再接着把内部类改成非内部类。
类级别重构
类级别重构有如下一些:
1. Push Down
“Push Down”重构功能是把父类的方法和属性移动到所有的子类中,父类的方法可以选择性的保留抽象方法。首先选择父类,右键选择Refactor菜单的“Push Down”菜单项,可以通过“Push Down”对话框选择重构,如图8所示。
图8 “Push Down”对话框
“Push Down”重构在重新设计类的时候是非常有用的,它可以比较有较的改善类的继承关系,清楚定义类的行为。
2. Pull Up
“Pull Up”重构和“Push Down”重构正好相反,它的作用是把方法和属性移动到其父类中去。选择需要重构的子类,从右键菜单选择Refactor菜单的“Pull up”菜单项,通过“Pull Up”对话框进行重构,如图9所示。
图9 “Pull Up”对话框
提示:“Pull Up”重构和“Push Down”重构后可能会出错,在使用此重构的同时,应该先弄清楚某些方法中是否有引用到其它方法或属性。
3. Extract Interface
“Extract Interface”重构能够从一个已存在的类中提取接口,它可以从某个类中选择方法,把这些方法提取到一个单独的接口中。选择提取接口的类,右键选择Refactor菜单的“Extract Interface”菜单项,打开“Extract Interface”对话框,如图10所示。
图10 “Extract Interface”对话框
单元OK按钮,将会提取TestInterface的接口,提取接口后,当前选择的类将会实现此接口。
提示:只有公用方法才可以被提取为接口的方法。
4. Generalize Declared Type
“Generalize Declared Type”重构能够改变变量、参数、属性以及函数的返回值的类型,可以把这些类型改成其父类的类型。在Refactor菜单中选择“Generalize Declared Type”,如图11所示。
图11 “Generalize Declared Type”对话框
单击OK按钮,能够把声明的类型改成当对话框中选择的类型。
5. User Supertype Where Possible
“User Supertype Where Possible”重构能够用某一个类的父类的类型替换当前类的类型,选择需要被替换引用的类。在Refactor菜单中选择“User Supertype Where Possible”打开“User Supertype Where Possible”对话框,如图12所示。
图12 “User Supertype Where Possible”对话框
“Generalize Declared Type”重构和“User Supertype Where Possible”重构在面向接口编程方面是很有用的,可以把引用的对象尽可能用接口进行实现。
提示:“User Supertype Where Possible”重构将替换其它类中的引用,要想看到重构的效果,应该找到其它类引用的位置,此操作不会修改当前文件。
类内部重构
类内部重构有如下一些:
1. Inline
“Inline”重构能用函数的内容替换掉函数的引用。首先选择函数的引用,在Refactor菜单中选择“Inline”打开“Inline”对话框,如图13所示。
图13 “Inline”对话框
单击确定按钮,Eclipse将会用方法实现的部分替换引用的部分,即当前不采用方法调用的方式进行操作。也可以选择“All invocations”和“Delete method declaration”,Eclipse会替换掉所有引用方法的位置,并且删除方法。
提示:Inline会用方法的实现部分替换所有调用方法的地方。
2. Extract Method
“Extract Method”重构和“Inline”重构相反,它能够从冗长的方法中提取小的方法,把大的方法分解成多个小方法来实现,通过此重构能够使代码看上去更简单漂亮,也很大程度上提高代码的复用性。可以选择要提取方法的代码,在Refactor菜单中选择“Extract Method”打开“Extract Method”对话框,如图14所示。
图14 “Extract Method”对话框
“Extract Method”重构是非常好的重构方式,能够把大的方法体重构成多个方法的实现,使代码更清楚易懂。
提示:“Extract Method”重构和“Inline”重构是对应的,有些时候为了组织一些不合的函数,可以先通过“Inline”的方式生成一个大的函数,再通过“Extract Method”来重构大的函数,使代码更趋于合理。
3. Extract Local Variable
在开发过程中,使用变量代替表达式是非常好的,这样能使代码更容易被理解。Eclipse中可以通过“Extract Local Variable”重构实现提取局部的表达式。首先选择表达式,在Refactor菜单中选择“Extract Local Variable”打开“Extract Local Variable”对话框,如图15所示。
图15 “Extract Local Variable”对话框
4. Extract Constant
“Extract Constant”重构和“Extract Local Variable”重构类似,它可以把表达式定义为常量,另外“Extract Constant”重构能够设定常量的可见性。选择表达式,在Refactor菜单中选择“Extract Constant”打开“Extract Constant”对话框,如图16所示。
图16 “Extract Constant”对话框
5. Introduce Parameter
“Introduce Parameter”重构可以通过函数中的表达式、变量或引用为函数添加新的参数,还能够自动更新引用此函数的其它位置的默认参数。要想进行“Introduce Parameter”重构,可以选择表达式、变量或引用。在Refactor菜单中选择“Introduce Parameter”打开“Introduce Parameter”对话框,如图17所示。
图17 “Introduce Parameter”对话框
6. Introduce Factory
“Introduce Factory”重构能够为类创建工厂方法。首先选择需要创建工厂方法的类的构造函数,在Refactor菜单中选择“Introduce Factory”打开“Introduce Factory”对话框,如图18所示。
图18 “Introduce Factory”对话框
在“Introduce Factory”对话框中,可以输入工厂方法的名字,以及工厂类,Eclipse将会自动根据构造函数创建工厂方法。
提示:工厂类应该已经存在,通常可以在一个工厂类中为多个关联的类创建工厂方法,所以在使用“Introduce Factory”重构前,应该先创建好工厂类。
7. Convert Local Variable to Field
“Convert Local Variable to Field”重构能够把局部的变量转换成类中的全局变量。首先选择要转换的局部变量,在Refactor菜单中选择“Convert Local Variable to Field”打开“Convert Local Variable to Field”对话框,如图19所示。
图19 “Convert Local Variable to Field”对话框
在“Convert Local Variable to Field”对话框中,还能够修改变量的名称以及变量的可见性。
8. Encapsulate Field
“Encapsulate Field”重构能够包装属性的可访问性,以及生成访问的方法。首先选择要包装的属性,在Refactor菜单中选择“Encapsulate Field”打开“Encapsulate Field”对话框,如图20所示。
图20 “Encapsulate Field”对话框
通常通过“Encapsulate Field”可以生成get和set方法。在“Encapsulate Field”对话框中可以输入属性的访问方法的名称,以及方法生成的位置和方法的可见性。
提示:通过右键菜单的Source菜单也能生成相应的get和set方法。
Undo and Redo
Eclipse的自动重构功能能够很好的支持各种程序元素的重命名,并自动更新相关的引用。Eclipse能够支持方法、字段在类之间移动,并自动更新引用,较好地支持内联字段、函数的更新替换,较好地支持抽取方法、变量等程序元素。
重构的过程是一个不断尝试和探索的过程。Eclipse的重构支持撤销和重做,并且能够预览重构结果,这些是很实用的功能。要想执行撤消和重做(Undo and Redo)的功能,可以直接按快捷键Ctrl+Z以及Ctrl+Y,也可以选择Edit菜单的Undo和Redo操作。
提示:虽然Eclipse对重构提供了很强大的支持,但是重构后代码的测试是必不可少的,而且不能指望Eclipse能够解决所有重构的问题,有些时候手动重构还是必须的。自动重构的理念应该是“工具辅助下的重构工作”,但开发人员仍然承担很大一部分重构工作。
有很多种原因,开发人员应该重构代码,例如之前的开发人员代码写得很烂、自己以前设计时有缺陷、需求变更需要添加一些新的功能或修改原有功能等等。Martin Fowler在其著名的<<Refactoring—Improving the Design of Existing Code>>一书中谈到了为何重构的几点原因:
1. 重构可以改进软件设计
如果不进行重构,程序的设计会变得越来越糟糕。通常程序员只为短期的目的,或者在没有完全理解整体设计的时候,就开始修改代码,这样程序将会逐渐失去自己的结构,程序员也愈来愈难通过阅读源码理解原本设计,相信对此每一个开发人员都深有体会。
代码结构的流失是累积性的,愈难看出代码所代表的意思,就越难保护其中的设计,于是设计也将变得越来越糟糕,经常性重构可以帮助维持设计该有的形态。
2. 重构使软件更易被理解
很多开发人员认为代码只要能够运行起来就可以了,笔者刚开始做开发的时候也是这么认为的,也写过很多的垃圾代码,也因此吃了不少苦头。
也许有些人可能会认为自己可能不久就会离开所在的职位,不必在意代码的质量,但作为一个开发人员来说,写出漂亮的代码是最基本的素质。
在软件的不断修改过程中,代码的可读性越来越差也是会慢慢累积的,但这不要紧,只要记得持续重构,就能使自己的代码更容易被理解。
3. 重构可以协助找到Bugs
对代码的理解,可以更容易找到bug,在重构的同时,也能够更好的理解代码及其行为,从而通过重构能够帮助开发人员写出更强壮的代码。
4. 重构可以提高编程的速度
良好的设计是快速软件开发的根本,如果没有良好的设计,也许开始的一段时间开发人员的进展迅速,但是恶劣的设计很快就会使开发速度慢下来。也许把时间花在调试上的时间会越来越多,修改的时间会越来越长,而且这会是一个恶性的循环。
良好的设计是维持软件开发速度的根本,重构可以帮助开发人员更快速地开发软件,因为它能够阻止系统的设计变质,能够提高代码的可读性。
使用Eclipse进行代码重构
重构是软件开发过程中保证代码质量非常重要的手段,而手动进行重构代码的话,很容易引入一些低级错误(例如,单词拼写错误),从而导致浪费大量不必要的时间。Eclipse为重构提供了很强大的支持,很大程度上用户不必为重构的笔误而再烦恼。
在Eclipse中,可以使用JDT提供的重构功能对Java项目、类和其成员进行重构,所有这些被重构的部分都可以看成一个JDT能识别的Java元素。要执行重构,首先必须选择相应重构的Java元素,一些重构是适合任何Java元素的,而一部分重构只适合特定的Java元素,几乎所有的重构都能够在重构对话框中看到预览的效果。
要使用Eclipse的重构功能,可以先选择相应的Java元素(Java工程中的资源,包括工程、文件、方法、变量等),通过右键菜单选择Refactor菜单下的重构功能,如图1所示。
图1 选择重构菜单
在Eclipse中,可以简单的把重构分为结构性重构、类级别重构和类内部重构,每种类型的重构又分别包含了一些具体的实现,接下来将分别介绍Eclipse如何对Java元素进行重构。
提示:在JDT可识别的范围内,可以认为工程中资源都是Java元素,包括Java文件名、类、方法、变量等。
结构性重构
结构性重构涉及到JAVA元素的物理结构的改变,包括“Rename”、“Move”、“Change Method Signature”、“Convert Anonymous Class to Nested”和“Move Member Type to New File”,下面将一一介绍这些重构在Eclipse中的实现。
1. Rename
Rename重构的功能就是重命名Java元素。虽然可以通过手动修改文件的文件名或其它Java元素的名称,但这种方式不会更新与此Java元素相关联的引用,用户必须手动查找和此Java元素相关的位置,然后进行手动修改。通过手动修改名称的方式,造成笔误的可能性会太太增加。通过Eclipse提供的Rename的功能,Eclipse会自动完成更新相关引用的操作。
当Java元素的命名不清晰或功能发生改变的时,为了保持代码的可读性,可以通过Eclipse的重构功能重命名Java元素。选择相应的Java元素,选择右键Refactor菜单下的Rename菜单,可以对当前选择的元素进行重命名,在弹出的重命名对话框中修改相应的元素名称即可,例如修改一个包的重命名,如图2所示。
图2 Rename对话框
要修改包名的同时,可以选择是否更新引用和更新子目录,甚至是非Java文件也可以选择性的更新。选择Preview按钮可以预览重命名重构后的效果,如图3所示。
图3 预览重命名包名
可以查看预览的内容是否一致,确认是否要进行重命名的重构。可以进行重命名的Java元素有Java项目、Java文件、包、方法和属性字段等。
提示:非Java项目和Java文件等也可以通过重构菜单的Rename进行重命名。
2. Move
Move的重构和Rename的重构类似,它可以把一个Java元素从一个地方移动到另一个地方,Move的重构主要用来移动一个类到不同的包下。首先选中一个Java文件,选择Refactor菜单下的Move菜单项,弹出Move的重构对话框,如图4所示。
图4 Move对话框
可以选择是否更新引用,设定移动文件重构的一些参数。
提示:也可以通过拖动的方式把一个文件从一个包移动到另一个包,实现移动文件的重构。
3. Change Method Signature
“Change Method Signature”重构的功能是改变方法的定义,例如改变方法的参数名称、类型和个数、返回值的类型,方法的可见性以及方法的名称等。
要改变方法的定义,可以先选择方法,通过右键菜单选择Refactor菜单的“Change Method Signature”子菜单项,弹出“Change Method Signature”对话框,如图5所示。
图5 “Change Method Signature”对话框
可以通过“Change Method Signature”对话框改变方法的参数名称、类型和个数、返回值的类型,方法的可见性以及方法名称等。
4. Convert Anonymous Class to Nested
“Convert Anonymous Class to Nested”重构的功能是把匿名类改成内部类,这样同一个类的其它部分也可以共享此类了。
例如有例程1所示的类。
例程1 KeyListenerExample.java
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(); } }
在KeyListenerExample类有一个匿名类,实现了KeyListener接口,可以把这个匿名类改成内部类,首先选择匿名类,右键选择Refactor的“Convert Anonymous Class to Nested”菜单,输入内部类的名称,如图6所示。
图6 “Convert Anonymous Class to Nested”对话框
重构后的结果是Eclipse为此创建了一个内部类,名称为TestKeyListener,重构后的代码如例程2所示。
例程2 重构后的KeyListenerExample.java
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(); } }
也可以通过“Convert Anonymous Class to Nested”对话框定义新生成的内部类的可访问性。
5. Move Member Type to Top Level
通过“Move Member Type to Top Level”的重构方式,可以把内部类改成非内部类,并且重新创建一个新的文件,这样其它的类就可以共享此类。
例程2创建了一个内部类TestKeyListener,现在可以通过“Move Member Type to Top Level”重构的方式,把TestKeyListener放入一个单独的类中。首先选择TestKeyListener类,从右键菜单Refactor中选择“Move Member Type to Top Level”,打开“Move Member Type to Top Level”对话框,如图7所示。
图7 “Move Member Type to Top Level”对话框
通过上面“Move Member Type to Top Level”重构,可以把内部类改成非内部类。
提示:有些时候,重构并不是一步完成的,可以一步一步重构,例如,首先把匿名类改成内部类,再接着把内部类改成非内部类。
类级别重构
类级别重构有如下一些:
1. Push Down
“Push Down”重构功能是把父类的方法和属性移动到所有的子类中,父类的方法可以选择性的保留抽象方法。首先选择父类,右键选择Refactor菜单的“Push Down”菜单项,可以通过“Push Down”对话框选择重构,如图8所示。
图8 “Push Down”对话框
“Push Down”重构在重新设计类的时候是非常有用的,它可以比较有较的改善类的继承关系,清楚定义类的行为。
2. Pull Up
“Pull Up”重构和“Push Down”重构正好相反,它的作用是把方法和属性移动到其父类中去。选择需要重构的子类,从右键菜单选择Refactor菜单的“Pull up”菜单项,通过“Pull Up”对话框进行重构,如图9所示。
图9 “Pull Up”对话框
提示:“Pull Up”重构和“Push Down”重构后可能会出错,在使用此重构的同时,应该先弄清楚某些方法中是否有引用到其它方法或属性。
3. Extract Interface
“Extract Interface”重构能够从一个已存在的类中提取接口,它可以从某个类中选择方法,把这些方法提取到一个单独的接口中。选择提取接口的类,右键选择Refactor菜单的“Extract Interface”菜单项,打开“Extract Interface”对话框,如图10所示。
图10 “Extract Interface”对话框
单元OK按钮,将会提取TestInterface的接口,提取接口后,当前选择的类将会实现此接口。
提示:只有公用方法才可以被提取为接口的方法。
4. Generalize Declared Type
“Generalize Declared Type”重构能够改变变量、参数、属性以及函数的返回值的类型,可以把这些类型改成其父类的类型。在Refactor菜单中选择“Generalize Declared Type”,如图11所示。
图11 “Generalize Declared Type”对话框
单击OK按钮,能够把声明的类型改成当对话框中选择的类型。
5. User Supertype Where Possible
“User Supertype Where Possible”重构能够用某一个类的父类的类型替换当前类的类型,选择需要被替换引用的类。在Refactor菜单中选择“User Supertype Where Possible”打开“User Supertype Where Possible”对话框,如图12所示。
图12 “User Supertype Where Possible”对话框
“Generalize Declared Type”重构和“User Supertype Where Possible”重构在面向接口编程方面是很有用的,可以把引用的对象尽可能用接口进行实现。
提示:“User Supertype Where Possible”重构将替换其它类中的引用,要想看到重构的效果,应该找到其它类引用的位置,此操作不会修改当前文件。
类内部重构
类内部重构有如下一些:
1. Inline
“Inline”重构能用函数的内容替换掉函数的引用。首先选择函数的引用,在Refactor菜单中选择“Inline”打开“Inline”对话框,如图13所示。
图13 “Inline”对话框
单击确定按钮,Eclipse将会用方法实现的部分替换引用的部分,即当前不采用方法调用的方式进行操作。也可以选择“All invocations”和“Delete method declaration”,Eclipse会替换掉所有引用方法的位置,并且删除方法。
提示:Inline会用方法的实现部分替换所有调用方法的地方。
2. Extract Method
“Extract Method”重构和“Inline”重构相反,它能够从冗长的方法中提取小的方法,把大的方法分解成多个小方法来实现,通过此重构能够使代码看上去更简单漂亮,也很大程度上提高代码的复用性。可以选择要提取方法的代码,在Refactor菜单中选择“Extract Method”打开“Extract Method”对话框,如图14所示。
图14 “Extract Method”对话框
“Extract Method”重构是非常好的重构方式,能够把大的方法体重构成多个方法的实现,使代码更清楚易懂。
提示:“Extract Method”重构和“Inline”重构是对应的,有些时候为了组织一些不合的函数,可以先通过“Inline”的方式生成一个大的函数,再通过“Extract Method”来重构大的函数,使代码更趋于合理。
3. Extract Local Variable
在开发过程中,使用变量代替表达式是非常好的,这样能使代码更容易被理解。Eclipse中可以通过“Extract Local Variable”重构实现提取局部的表达式。首先选择表达式,在Refactor菜单中选择“Extract Local Variable”打开“Extract Local Variable”对话框,如图15所示。
图15 “Extract Local Variable”对话框
4. Extract Constant
“Extract Constant”重构和“Extract Local Variable”重构类似,它可以把表达式定义为常量,另外“Extract Constant”重构能够设定常量的可见性。选择表达式,在Refactor菜单中选择“Extract Constant”打开“Extract Constant”对话框,如图16所示。
图16 “Extract Constant”对话框
5. Introduce Parameter
“Introduce Parameter”重构可以通过函数中的表达式、变量或引用为函数添加新的参数,还能够自动更新引用此函数的其它位置的默认参数。要想进行“Introduce Parameter”重构,可以选择表达式、变量或引用。在Refactor菜单中选择“Introduce Parameter”打开“Introduce Parameter”对话框,如图17所示。
图17 “Introduce Parameter”对话框
6. Introduce Factory
“Introduce Factory”重构能够为类创建工厂方法。首先选择需要创建工厂方法的类的构造函数,在Refactor菜单中选择“Introduce Factory”打开“Introduce Factory”对话框,如图18所示。
图18 “Introduce Factory”对话框
在“Introduce Factory”对话框中,可以输入工厂方法的名字,以及工厂类,Eclipse将会自动根据构造函数创建工厂方法。
提示:工厂类应该已经存在,通常可以在一个工厂类中为多个关联的类创建工厂方法,所以在使用“Introduce Factory”重构前,应该先创建好工厂类。
7. Convert Local Variable to Field
“Convert Local Variable to Field”重构能够把局部的变量转换成类中的全局变量。首先选择要转换的局部变量,在Refactor菜单中选择“Convert Local Variable to Field”打开“Convert Local Variable to Field”对话框,如图19所示。
图19 “Convert Local Variable to Field”对话框
在“Convert Local Variable to Field”对话框中,还能够修改变量的名称以及变量的可见性。
8. Encapsulate Field
“Encapsulate Field”重构能够包装属性的可访问性,以及生成访问的方法。首先选择要包装的属性,在Refactor菜单中选择“Encapsulate Field”打开“Encapsulate Field”对话框,如图20所示。
图20 “Encapsulate Field”对话框
通常通过“Encapsulate Field”可以生成get和set方法。在“Encapsulate Field”对话框中可以输入属性的访问方法的名称,以及方法生成的位置和方法的可见性。
提示:通过右键菜单的Source菜单也能生成相应的get和set方法。
Undo and Redo
Eclipse的自动重构功能能够很好的支持各种程序元素的重命名,并自动更新相关的引用。Eclipse能够支持方法、字段在类之间移动,并自动更新引用,较好地支持内联字段、函数的更新替换,较好地支持抽取方法、变量等程序元素。
重构的过程是一个不断尝试和探索的过程。Eclipse的重构支持撤销和重做,并且能够预览重构结果,这些是很实用的功能。要想执行撤消和重做(Undo and Redo)的功能,可以直接按快捷键Ctrl+Z以及Ctrl+Y,也可以选择Edit菜单的Undo和Redo操作。
提示:虽然Eclipse对重构提供了很强大的支持,但是重构后代码的测试是必不可少的,而且不能指望Eclipse能够解决所有重构的问题,有些时候手动重构还是必须的。自动重构的理念应该是“工具辅助下的重构工作”,但开发人员仍然承担很大一部分重构工作。
发表评论
-
java.lang.ClassCircularityError
2015-07-27 00:39 1334类循环依赖错误。在初始化一个类时,若检测到类之间循环依赖则抛出 ... -
随记内容
2015-06-09 00:10 0public static CloseableHttpClie ... -
httpclient3.1使用小结
2017-08-18 00:08 684Jakarta的httpclient3.1是 ... -
POI
2014-05-21 16:08 552Apache POI是一个开源的Java读写Excel、WOR ... -
servlet与js 跳转
2014-05-15 17:19 846servlet跳转 1.request.getRequestD ... -
jdk各个版本下载地址
2014-05-12 17:40 962http://www.oracle.com/technetwo ... -
Jackson库
2014-04-20 13:17 947概述 Jackson库(http://jac ... -
生成Webservice客户端的4种方法
2014-04-09 15:39 10971.使用Axis生产客户端代码(另存为bat文件) 之前很多次 ... -
map遍历
2013-12-14 23:41 514Map<String, String> map = ... -
POI处理Excel
2013-12-14 22:44 8841.读取2003 InputStream stream ... -
常用数据库 JDBC URL 格式
2013-12-04 18:35 1125Microsoft SQL Server Microsoft ... -
公共查询接口
2013-12-04 15:19 1194http://www.webmasterhome.cn/ ht ... -
天气预报接口
2013-12-04 11:18 1397天气预报接口(中国天气网) 中国天气weather.com ... -
Java 判断文件夹、文件是否存在
2013-12-04 10:00 51111、判断文件是否存在,不存在创建文件 File file=ne ... -
Jakarta Commons Pool
2013-12-03 14:55 851使用Jakarta Commons Pool可以根据需要快速的 ... -
多线程读写资料利器-ReentrantReadWriteLock
2013-12-03 14:49 1304多线程读写文件利器-ReentrantReadWriteLoc ... -
保持顺序的 Java Properties 类
2013-12-02 16:21 900public class OrderedProperties ... -
java中用poi处理Excel表格之读取
2013-11-18 16:24 2026http://tool.oschina.net/apidocs ... -
科大讯飞语音识别服务
2013-09-03 17:06 13931.官方地址:http://open.voicecloud.c ... -
ibatis数据库字段带下划线(_)映射与java类不一致
2013-08-24 17:00 5336ibatis数据库字段带下划线(_)与java pojo对象映 ...
相关推荐
### Eclipse详解 #### 一、Eclipse概述与目标 Eclipse 是一款强大的开源集成开发环境(IDE),由 IBM 和 OTI (Object Technology International) 联合创建,并于2001年正式发布。它主要面向 Java 开发者,但通过...
Eclipse 3 技术详解是一份深度剖析Eclipse 3.x版本的综合资源,它涵盖了这个开源集成开发环境(IDE)的各个方面。Eclipse 3.x是Eclipse平台的一个重要里程碑,它提供了丰富的功能和扩展性,为软件开发者提供了强大的...
**Eclipse工具详解** Eclipse是一款广泛应用于Java开发的开源集成开发环境(IDE),它以其强大的功能、灵活性和丰富的插件支持,深受开发者喜爱。在本文档中,我们将深入探讨Eclipse的各项特性和使用技巧,包括基本...
1. JDT(Java Development Tools):Eclipse内置的Java开发工具集,提供语法高亮、代码提示、重构、调试等多种功能。 2. 类路径管理:理解并管理类路径是Java开发的关键,Eclipse可以帮助开发者轻松处理依赖关系。 3...
《Eclipse 3.0 程序开发技术详解》一书由吴越胜等人编著,清华大学出版社于2010年出版,是针对Eclipse 3.0这一版本的详细开发指南。Eclipse是一个开源的集成开发环境(IDE),广泛应用于Java和其他语言的软件开发。...
**Eclipse 快捷键详解** Eclipse 是一个强大的开源集成开发环境(IDE),尤其在Java编程领域中广泛应用。为了提高编程效率,掌握Eclipse的快捷键至关重要。本篇文章将详细解析Eclipse中的常用快捷键及其功能,帮助...
同时,PDT插件还提供了PHP代码分析和重构功能,帮助你编写更高质量的代码。 在实际操作中,图片文件(如2004.11.10.14.35.23.06.jpg等)可能提供了详细的步骤截图,帮助读者更好地理解每个配置步骤。而“搭建...
#### 六、Eclipse界面详解 - **组成元素**:Eclipse界面主要包括标题栏、菜单栏、工具栏、编辑器和视图等,其中工具栏分为主工具栏和视图工具栏,前者是全局性的,后者则是特定于透视图的。 - **视图工具栏**:每...
重构也是Eclipse的一大亮点,如Rename、Extract Method、Move等功能,能够安全地改变代码结构而不影响程序行为。使用快捷键Alt+Shift+R可以快速重命名类、方法或变量。 为了提高团队协作,Eclipse集成了版本控制...
【Eclipse IDE详解】 Eclipse是一款著名的开源集成开发环境(IDE),主要面向Java开发者,但也可用于其他编程语言。在2019年发布的最新版本中,它继续提供高效、强大的开发工具,以支持现代软件工程的需求。这个...
《AspectJ Eclipse 插件ajdt2.2.3的安装与使用详解》 AspectJ是一种面向切面编程(AOP)的语言扩展,它允许开发者在Java代码中声明切面,以此来处理横切关注点,如日志、事务管理等。AspectJ Eclipse插件(ajdt)则...
**m2eclipse1.6.1: Maven 集成与 Eclipse 插件详解** 在软件开发领域,Maven 和 Eclipse 是两个极为重要的工具。Maven 是一个项目管理和综合工具,它帮助开发者构建、管理和部署Java项目。而Eclipse是一款广泛使用...
** Jad和Jadeclipse插件详解 ** Jad与Jadeclipse是Java开发者在Eclipse集成开发环境中用于反编译Java字节码的利器。它们为程序员提供了深入理解已编译代码的能力,这对于调试、逆向工程或者学习第三方库的工作原理...
《m2eclipse插件详解及其核心组件剖析》 m2eclipse插件,全称为Maven for Eclipse,是Eclipse集成开发环境(IDE)中的一款强大工具,它为Eclipse用户提供了无缝集成Apache Maven的功能,使得在Eclipse中管理Maven...
《Eclipse开发实例详解——基于eclipse-examples-3.2.2-win32》 在软件开发领域,Eclipse是一款广泛使用的集成开发环境(IDE),尤其在Java编程语言中,它的影响力不容忽视。Eclipse-examples-3.2.2-win32是专门为...
《Eclipse IDE for Linux平台的安装与使用详解》 Eclipse是全球开发者广泛使用的开源集成开发环境(Integrated Development Environment,IDE),尤其在Java编程领域,它以其强大的功能和高度的可扩展性备受赞誉。...
### Eclipse快速上手指南知识点详解 #### 一、Eclipse简介 - **定义与特性**:Eclipse是一款功能强大的开源集成开发环境(IDE),尤其适用于Java应用程序的开发。该平台最大的特点是其高度可扩展性,这得益于其插件...
### Java开发环境Eclipse SDK 知识点详解 #### 一、Eclipse SDK 概述 Eclipse SDK(Software Development Kit)是一款免费开源的集成开发环境(IDE),主要用于Java应用程序的开发,它由Eclipse Foundation负责...