结构性重构
结构性重构涉及到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”重构,可以把内部类改成非内部类。 提示:有些时候,重构并不是一步完成的,可以一步一步重构,例如,首先把匿名类改成内部类,再接着把内部类改成非内部类。