今天写程序,用了一个简单工厂模式,工厂类有一个静态工厂方法,传入一个参数,根据参数生成不同的对象:
代码
public static GateWayCaller getGateWayCaller(String serviceKey)
{
if("alerting".equals(serviceKey))
{
return new AlertingCaller();
}
else if("report".equals(serviceKey))
{
return new ReportCaller();
}
//...
else
{
return null;
}
}
一同事硬说我return null不对,应该抛出一个checked异常,由客户端调用者去处理该异常。我的想法很简单,既然这是一个生成对象的方法,如果调用者将参数传错导致要生成的对象不存在,就应该返回一个空对象,而不是抛出异常。不然的话所有客户端代码都要处理一个没用的异常!!搞的好郁闷,最受不了的是老说我什么什么观点是错误的。俺也没有什么太多的编程经验,也不知道该怎么去反驳。我认为没有哪个观点是绝对错误的,只有比较之下哪种做法更好一点?听听大家的意见?
代码
public static GateWayCaller getGateWayCaller(String serviceKey)
{
if("alerting".equals(serviceKey))
{
return new AlertingCaller();
}
else if("report".equals(serviceKey))
{
return new ReportCaller();
}
//...
else
{
return null;
}
}
一同事硬说我return null不对,应该抛出一个checked异常,由客户端调用者去处理该异常。我的想法很简单,既然这是一个生成对象的方法,如果调用者将参数传错导致要生成的对象不存在,就应该返回一个空对象,而不是抛出异常。不然的话所有客户端代码都要处理一个没用的异常!!搞的好郁闷,最受不了的是老说我什么什么观点是错误的。俺也没有什么太多的编程经验,也不知道该怎么去反驳。我认为没有哪个观点是绝对错误的,只有比较之下哪种做法更好一点?听听大家的意见?
2. 他只知道他得到了一个null,却不知道实际原因是什么,实际上的原因是他传入了不被接受的参数,但返回null并没有告诉他这一点。所以,建议你的代码写成这样:
if("alerting".equals(serviceKey))
return new AlertingCaller();
else if("report".equals(serviceKey))
return new ReportCaller();
//...
else
throw new RuntimeException("Invalid Service Key!");这样如果传入的参数不是方法所接受的,运行时就会打印出合适的消息,这比得到一个NullPointerException要好得多。
相信你和你的同事不是在抛出RuntimeException还是checked exception这一点上存在分歧。
题外话:作为新手要虚心,别人的意见即使是错的也不要急于反驳,先自己好好想一想。