日常编辑 (二)
在我们的日常编辑中,我们经常在代码上有一个重构,在变量这个级别,VJDE支持一点小的重构功能.
在日常的编译过程中,有一些已经成为定势的编译错误解决办法,在VJDE中,也可以自动为我们完成.下面我们就来讲讲这方面的功能.
- 重构成局部变量
- 重构成成员变量
- 重构成参数
- 常数重构
- 没有找到符号的修正
- 用 try-catch 修正
- 用 throws 修正
重构成局部变量
在开发过程,有时个,一个变量被定义成了块内的临时变量,可是,我们需要在块外部继续使用.这里,我们希望它的定义成为函数内部的局部变量,如下代码:
package test;
public class Test extends Thread implements MouseListener {
public static void main(String[] args) {
System.out.println( "Hello World!");
try {
File f = new File("abc");
}
catch(Exception ex) {
//TODO: Add Exception handler here
}
}
}
这个时候的 f 这个变量就是这样的了.我们只需要把光标移动到 f 上,然后使用命令\el,Extract local variable. 即生成如下代码:
package test;
public class Test extends Thread implements MouseListener {
public static void main(String[] args) {
File f = null ;
System.out.println( "Hello World!");
try {
f = new File("abc");
}
catch(Exception ex) {
//TODO: Add Exception handler here
}
}
}
这时候, f已经是一个局部变量了.
重构成成员变量
一个变量我们在类中使用和开发的时候,我们忽然发现,它应该是一个成员变量,我们希望把它的定义提到类声明处.
虽然我们自己也可以办到,但是, VJDE 提供了一个简单的办法,仍以刚才的代码中的File f = new File("abc");为例:
把光标移动到f上后,我们使用命令 \em,Extract member variable. 则代码如下:
package test;
public class Test extends Thread implements MouseListener {
File f = null ;
public static void main(String[] args) {
System.out.println( "Hello World!");
try {
f = new File("abc");
}
catch(Exception ex) {
//TODO: Add Exception handler here
}
}
}
重构成参数
另外一些时候,我们则有可能希望这个变量成为参数传入,而不是自己定义.
移动光标到f上,我们使用命令 \ep,Extract parameter,则生成如下代码:
package test;
public class Test extends Thread implements MouseListener {
public static void main(String[] args,File f) {
System.out.println( "Hello World!");
try {
f = new File("abc");
}
catch(Exception ex) {
//TODO: Add Exception handler here
}
}
}
虽然这个结果不是我们想看到的main函数,但是,这个功能再此已经没有问题了.
现在,我们再来看看 VJDE 编译错误修正功能.在编译过程中,我们有两个错误是可以明显修正的:
由于系统的不一样,生成的错误提示也是不一样,VJDE默认是 JDK1.5的英文支持,为了在中文环境下也使用本功能,需要将下面两行加入到你的 vimrc 文件:
let g:vjde_java_exception='\(未报告的异常\) \([^ \t;]*\);'
let g:vjde_java_symbol='找不到符号.*\n符号.*类\s*\([^ \t;\s]*\)\n'
如果你不确定你的 java 是什么版本,请在命令行运行 javac ,看输出信息即可.
常数重构
在很多的开发编程的推荐中,我们发现,Java 开发时,推荐把一些常量字符串,或者一些数字,定义为 const , 而不是直接使用值.
package test;
public class Test {
public static void main(String[] args) {
System.out.println( "Hello World!");
int a = 0;
if ( a != 100 ) {
}
}
}
现在,我们希望把 "Hello World!"做成一个常量
第一步,我们先选择这个字符串,简单办法,移动光标到 " " 中的任何一个字符.使用va",请参考 :h a"
第二步,在选择模式下,使用命令\en, Extract coNst.
这时,会有对话框提示我们输入我们要使用的名字,在这里,我们输入HELLO.
则生成了如下的代码:
package test;
public class Test {
private final static int HELLO = "Hello World!" ;
public static void main(String[] args) {
System.out.println(HELLO);
int a = 0;
if ( a != 100 ) {
}
}
}
现在,我们再选择数字 100,再次使用命令\en,输入 MAX,则变成如下代码:
package test;
public class Test {
private final static int MAX = 100 ;
private final static int HELLO = "Hello World!" ;
public static void main(String[] args) {
System.out.println(HELLO);
int a = 0 ;
if ( a < MAX ) {
}
}
}
这样,对于添加一个常数是不是方便了很多呢?
没有找到符号的修正
没有找到类这个错误,通常情况下,我们是需要将这个类的包加入到我的源代码中
package test;
public class Test {
public static void main(String[] args) {
System.out.println( "Hello World!");
File f;
}
}
我们使用:Vjdec进行编译后,就会发现报一个没有找到符号 File 的错误.我们都知道是需要把它引用进来.
在VJDE中,我们可以移动到这一行,当然,本例中,编译出错后,会直接转到这一行的.
提示: 在编译后,自动跳转到出错,并且在出错间使用 :cn :cfirst 等等命令跳转是非常方便的.请参考 :h quickfix
然后,我们使用命令 \fi,Fix with Import. 则import java.io.File;会被自动添加.
当然,你也可以使用我们上面提到的命令\ai来完成这个操作.生成的代码如下:
package test;
import java.io.File;
public class Test {
public static void main(String[] args) {
System.out.println( "Hello World!");
File f;
}
}
对于另一种错误,就是未报告的异常.修改办法一般是两种,一是用 try-catch 块,二是添加到函数定义的 throws 语句.
如以下代码,用:Vjdec编译时,就会生成这个错误.
package test;
import java.net.URLConnection;
import java.net.URL;
public class Test {
public static void main(String[] args) {
System.out.println( "Hello World!");
new URL("").openConnection();
}
}
会同时有两个异常,一个是 MalformedURLException,一个是IOException
用 try-catch 修正
如果我们希望这个代码被一个 try-catch 块包围的时候,
我们移动到当前行,使用命令 \ft,Fix with Try-catch.则代码自动如下:
package test;
import java.net.URLConnection;
import java.net.URL;
import java.net.MalformedURLException;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
System.out.println( "Hello World!");
try {
new URL("").openConnection();
}
catch(MalformedURLException e1) {
}
catch(IOException e5) {
}
}
}
我们已经成功的把 异常捕获并且生成了对应的代码了,连异常的引用也自动添加了.是不是很方便? ^_^
用 throws 修正
现在,我们再试试用 throws 语句来修正.
我们移动到当前行,使用命令 \fr,Fix with Try-catch.则代码自动如下:
package test;
import java.net.URLConnection;
import java.net.URL;
import java.net.MalformedURLException;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException, MalformedURLException {
System.out.println( "Hello World!");
new URL("").openConnection();
}
}