日常编辑 (二)


在我们的日常编辑中,我们经常在代码上有一个重构,在变量这个级别,VJDE支持一点小的重构功能.
在日常的编译过程中,有一些已经成为定势的编译错误解决办法,在VJDE中,也可以自动为我们完成.下面我们就来讲讲这方面的功能.
  1. 重构成局部变量
  2. 重构成成员变量
  3. 重构成参数
  4. 常数重构
  5. 没有找到符号的修正
  6. 用 try-catch 修正
  7. 用 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();
	}
}
	

日常编辑 (一) 主目录