最近在讲设计模式,讲完Template method后,留下一道作业,使用Template method 模式来实现冒泡排序,分别实现int,double,String行的排序,
今天看了很多使用Template method实现BubbleSort的代码,有些实现的比较好,
有些虽然体现了Template method,但是仔细推敲,存在类型安全问题。
例如:
存在以下代码:
public void Sort(Object obj[]){
….
}
protected abstract boolean Compare(Object first,Object second);
子类中的实现:
protected boolean Compare(Object first, Object second) {
double one=Double.parseDouble(first.toString());
double two=Double.parseDouble(second.toString());
return one > two;
}
测试代码如下:
Object[] myArray={-7.0,2.35,5.4,4.2};
BubbleSorter sorter= new DoubleBubbleSorter();
sorter.sort(myArray);
这段代码可以运行,但是存在安全隐患。
假如 客户这样使用:
Object[] myArray={”a”,”bde”,”b”,”e”};
BubbleSorter sorter= new DoubleBubbleSorter();
sorter.sort(myArray);
编译是可以通过的。但是执行的时候就会出现异常.
最好能在编译期就发现这类错误,而不是运行期。
其实java是强类型语言,Java 的安全和健壮性部分来自于它是该类型语言这一事实。首先,每个变量有类型,每个表达式有类型,而且每种类型是严格定义的。其次,所有的数值传递,不管是直接的还是通过方法调用经由参数传过去的都要先进行类型相容性的检查。Java 编译器对所有的表达式和参数都要进行类型相容性的检查以保证类型是兼容的。任何类型的不匹配都是错误的,在编译器完成编译以前,错误必须被改正。通过类型相容性的检查,java将帮助你减少程序出错的可能性。但是如果将类型声明为Object时,由于java单根继承于Object,也就是说所有类型都和Objcet类型兼容。这样做有时的确很灵活,但付出的代价却是存在类型安全问题,这样做等于把java 从强类型语言变成了弱类型语言,这样的程序,在使用的时候是比较危险的。
java 1.5出现的泛型技术更加加强了java的类型安全检查,特别对于java容器类更是如此。
强类型可以使代码更加安全健壮,但同时也降低了灵活性。但是安全性健壮性并不和灵活性总是矛盾,通过使用泛行技术能在一定程度上缓解这个矛盾。不过,一般来说,应尽可能的少用Object定义类型,毕竟有些时候没有了安全性/健壮性,灵活性也失去了意义。
以上是个人观点,也许有偏颇之处,欢迎指正。
