经常会碰到像如下的情况,有大量的类似的重复代码,请问如何避免?
1.大量的try...catch,很多方法,其实catch了做的都是一样的操作,像LOG记录一下什么的,有没有办法可以去掉代码中大量的雷同的try...catch呢?
2.给String类型赋值时,经常要判断是否等于NULL,如果为NULL,则设置为空字符串这样的情况,有没好一些的方法或技术可以实现我想知道的是具体的实现技术而不是某某框架可以实现,链接的,复制的均可,当然可以的话,希望能给出简单的示例代码,谢谢
1.大量的try...catch,很多方法,其实catch了做的都是一样的操作,像LOG记录一下什么的,有没有办法可以去掉代码中大量的雷同的try...catch呢?
2.给String类型赋值时,经常要判断是否等于NULL,如果为NULL,则设置为空字符串这样的情况,有没好一些的方法或技术可以实现我想知道的是具体的实现技术而不是某某框架可以实现,链接的,复制的均可,当然可以的话,希望能给出简单的示例代码,谢谢
2、这个我觉得最好有默认值,或者用3元表达式
2.可以不用去判断是否为null,不管什么时候都给后面加上"",但是估计效率会有影响!
关于2,就像这样public void setName(String name){
if(name==null)//当然,可以用?:,但是出现大量的类似代码还是觉得有点不舒服
this.name = "";
else
this.name = name;
}
谢谢各位的答复
package houlei.java.lang;/**
* 该类屏蔽的try-catch的相关代码,用户使用时,主要使用本类的对象进行编程。<br/>
* 当然,主要还要用到<code>TryCatchCallBack</code>类对象进行编程。
* @see houlei.java.lang.TryCatchCallback
* @author 侯磊
*/
public class EasyTryCatch {
/**
* 默认的异常处理器,用户可以根据自己的情况,自定义一个异常处理器,比如,记个日志什么的。
*/
private static final ErrorHandler DefaultHandler = ConsoleErrorHandler.getInstance();
/**
* 当前的异常处理器,如果不进行设置则采用默认的异常处理器。
*/
private ErrorHandler errorHandler = DefaultHandler;
public EasyTryCatch() {
} public EasyTryCatch(ErrorHandler errorHandler) {
super();
this.errorHandler = errorHandler;
} /**
* 用户通过调用该方法来完成对try-catch块内的代码调用。
* @param callback try-catch块内要执行的代码,都封装在这里。
*/
public void doTryCatch(TryCatchCallback callback){
try{
callback.doContext();
}catch (Throwable t) {
errorHandler.handleError(t);
}
} public ErrorHandler getErrorHandler() {
return errorHandler;
} public void setErrorHandler(ErrorHandler errorHandler) {
this.errorHandler = errorHandler;
}
}package houlei.java.lang;/**
* 该接口的实现类主要用于封装try-catch块内,要执行的代码。<br/>
* 通过<code>EasyTryCatch.doTryCatch</code>方法来回调使用。
* @see houlei.java.lang.EasyTryCatch
* @author 侯磊
*/
public interface TryCatchCallback {
/**
* 回调函数
* @throws Throwable 该对象实例就是try-catch中的代码抛出的异常,用户不用关心这个,这个会在ErrorHandler里面集中处理。
*/
void doContext()throws Throwable;
}package houlei.java.lang;/**
* 异常处理器的接口,用于封装针对try-catch块抛出异常的处理过程。<br/>
* 我这里主要实现了一个将异常打印在控制台的异常处理器,
* 用户可以考虑根据具体情况来编写实现类,比如写个日志什么的。
* @see houlei.java.lang.ConsoleErrorHandler
* @author 侯磊
*/
public interface ErrorHandler {
/**
* 当try-catch块中的代码抛出异常时,该方法被调用。
* @param t 在try-catch块中的代码抛出的异常
*/
void handleError(Throwable t);}
package houlei.java.lang;/**
* 控制台异常处理器,用于将捕获到的异常打印到控制台上。<br/>
* 由于一般情况下,程序都只有一个控制台,所以,我使用了单例模式,只能产生一个对象。
* @author 侯磊
*
*/
public class ConsoleErrorHandler implements ErrorHandler{
private static ConsoleErrorHandler instance = new ConsoleErrorHandler();
private ConsoleErrorHandler(){};
/**
* 得到控制台异常处理器的对象
*/
public static ErrorHandler getInstance(){
return instance;
}
/**
* 将异常的信息打印到控制台上。
* @see houlei.java.lang.ErrorHandler#handleError(java.lang.Throwable)
*/
public void handleError(Throwable t) {
t.printStackTrace();
}
}
package houlei.java.lang;/**
* 最土的测试用例。用来指导用户怎样使用这几个类。
* @author 侯磊
*/
public class EasyTryCatchTest {
/**
* 由于要产生异常,所以,专门编写了一个能产生异常的代码。大家不要介意。
*/
public static void main(String args[]) {
test0();
System.out.println("----------------------淫-荡-的-分-割-线------------------");
test();
}
/**
* 这个是原始的执行代码,用来与新的编程方式做对比的。
*/
public static void test0(){
int [] array = new int[]{1,2};
try{
for(int i=0;i<10;i++){
System.out.println(array[i]);
}
}catch(Throwable t){
t.printStackTrace();
}
}
/**
* 这个是新的编程方式,样例。
*/
public static void test(){
//这是try-catch块前面的代码,注意有些用到的变量要转换成final的。
final int [] array = new int[]{1,2};
//创建EasyTryCatch对象,它封装的try-catch的过程。
EasyTryCatch etc = new EasyTryCatch();
etc.doTryCatch(new TryCatchCallback(){//采用匿名内部类来实现try-catch块的代码。
public void doContext() throws Throwable {
for(int i=0;i<10;i++){
System.out.println(array[i]);
}
}
});
}}
package houlei.java.lang;/**
* 字符串的工具类,主要完成针对字符串的一些辅助操作。
* @author 侯磊
*/
public class StringUtil {
public static final String NULL = "";
/**
* 如果参数<code>str</code>为<code>null</code>,则返回一个空字符串。<br/>
* 如果参数<code>str</code>不为<code>null</code>,则返回参数<code>str</code>本身。
*/
public static String maskNull(String str){
return maskNull(str,NULL);
}
/**
* 如果参数<code>str</code>为<code>null</code>,则返回参数<code>def</code>的值。<br/>
* 如果参数<code>str</code>不为<code>null</code>,则返回参数<code>str</code>本身。
*/
public static String maskNull(String str,String def){
if(null == str){
str = def;
}
return str;
}}package houlei.java.lang;/**
* 最土的测试用例。
* @author 侯磊
*/
public class StringUtilTest {
public static void main(String args []){
String nullStr = null;//空字符串
String str = "hello world ...";//有内容的字符串
String defStr = "default string .";//默认的字符串
System.out.println("----------------------测--试--开--始----------------------");
System.out.println(StringUtil.maskNull(nullStr));//本身为空,返回空字符串。显示为空行。
System.out.println(StringUtil.maskNull(str));//不为空,显示本身
System.out.println(StringUtil.maskNull(nullStr,defStr));//为空,显示默认
System.out.println(StringUtil.maskNull(str,defStr));//不为空,显示本身
}
}
2.如上所说写个工具类就行了,这种简单的判断感觉没有必要做的太花哨了。
提出这个问题的原因,是因为在代码中能看到不少的,很雷同的重复代码,想要精简却又无从下手,谢谢各位的指导这个情况我是在和实际想联系的时候才这么写的,比如展示给用户时,如果是null只要显示空就成了,谢谢严谨的提示在看struts2的异常处理模式时,发现和preferme的方式有点像,不过就像他说的,有点担心性能方面的问题明天起来结贴,再看看大家有没别的什么意见
2.判断师是否为空,你可以写一个工具类,有的人会说就算写一个tools也会有很多地方需要调用,那么你写一个vo也同样有很多地方调用啊。 所以这根本就是个蛋痛的问题。呵呵