java5.0推出了,还号称tiger.我也兴奋的看到了我要的一些语言特征,觉得以后的开发将会方便许多。
然而tiger终究是tiger,让人难以亲近。我试用了下,有很多感受:
.基本数据类型和对象的自动互转
这的确方便了开发是好事,不过引起了当对象为空时如何取值的争论,我倾向抛Null异常;
.import static
这个功能还是应该提供的,不鼓励滥用。
不过我始终觉得import中的这个static太多余了,包也好,类也好,静态常量方法也好,
都可以看作import对象嘛,没有必要用static区分一下的,static反而使语法复杂化了。
.强类型还是更强的类型
强类型编译语言和弱类型脚本语言,我选择前者,也选择了java。强类型的优势我可以说出一些,在编译期能发现和排除一些错误,重构方便,特别当项目比较大时,每次编译通过都让我有一种很放松的感觉。因为类型都检阅过了没问题。但不可否认的是,现在的编程语言有类型弱化的趋势,像python这样的动态类型语言就很受程序员的青睐,java应该对这种现象进行反思。固守编译期强类型这道战线我想还是没错的,但要向更强的类型发展我看完全没必要。而5.0加入的泛型就显得多余,java控制了变量的类型还不够,还想通吃List,Map中的类型控制。本来List,Map只要对象就能放进去,加道控制不是自己给自己设卡么。有几个开发会犯这种错误,就算设错了类型,这种错误到运行期让它抛出就是了,没必要对原本简单的语法大作文章,你难道想在编译期就排除所有错误么?这本就办不到。而且语法又多了个泛型概念,复杂了。
.仍然蠢笨的强制类型转化
像下面这样的语法看是严谨
String str = (String)map.get("str");
其实是很蠢笨的,既然str已经定义是String型的,那么map中取出了值就应自动转到String型进行赋值,
那个强制转化(String)实在多余的很。况且你java还是编译型语言,你完全可以编码使用:
String str = map.get("str");
然后编译成实现如下功能的字节码:
String str = (String)map.get("str");
一门口口声声要减少重复代码,号称面向对象的语言,却在语法上让人写了多少重复代码?
然而tiger仍不思悔改,我行我素。除了那本不该有的泛型Map和List里的对象可以不用强制转型外,
其他赋值语句仍是老模样。
.受连累的for循环
对for循环的改造本是件大好事,可惜还是被强制类型搞得一团糟:
List items = ...;
for (Object item : items){
Item item1 = (Item)item;
...
}
或许你会说可以这样啊:
List<Item> items = ...;
for (Item item : items){
...
}
又是泛型!唉!
.趋于复杂化
泛型,还有如enum的引入等等,都使原本不简单的java变得更复杂。tiger难道真的是一只老虎?可能会有人赞叹其强大,可很难让使用者喜欢上它。
说了这么多java5.0的不是,我也不想抛弃它,真希望它越来越好。也说说我理想中的新java语法吧:
首先是静态编译语言,强类型。但如java1.4及以前的版本那样只对类型控制到变量;
另外最重要的是,要考虑编码员的体验,严谨的语法和好的编码体验本不矛盾,tiger就是制造了这种矛盾。
一门高级编程语言应该争取以最简洁的编码描述最多的信息,而不是以复杂的编码描述简单的信息。
我总结了以下的一些改进,其中借鉴了python的一些语法:
.import别名
import不但可以import包,类,静态成员,还能起个别名,特别是对类。
.强类型+简单编程(聪明的语法)
String str = map.get("str");//编译器自动转型
Integer i = list.get(0);
Integer ii = 123;
.支持自动转型后的for循环也因此变得简单
for Item item in items{
item.getName();
...
}
.如String那样,Map和List作为常用类型,要有方便的构造方法,
String str = "abc";
Map map = {"key1":value1,"key2":value2};
List list = {value1,value2};
用新java写的下面一段代码,也许会让你喜欢:
新java:(强类型)
package myp;
import net.jacker.UtilVarContext UtilVC;//类别名
import net.jacker.base;
public class MyClass {
public String process(Integer in,Map map,List list){
//Integer,Map,List等作为语法层支持的基础类型,类似String
Map map1 = {"abc":new Integer(0),"bbc":new Integer(1)};//{}定义map
List list1 = {"a","b","c"};//{}定义list
String[] strs = ["o","p","q"];//[]定义Array
Integer int0 = 1;//自动识别构造new Integer(1);
Integer[] ints = [1,2,3];
Integer int1 = map1.get("abc");//自动转型
String str1 = list1.get(2);
//for访问list,array
for String item in list1{
out(item);
}
//for访问list,array,使用index方式
for Integer i int index in ints{
out(i);
out(index);
}
for Integer i int index in ints[:-1]{
out(i);
out(index);
}
for Integer i int index in ints[1:10]{
out(i);
out(index);
}
//for访问map
for String key,Integer value in map1{
out(key);
out(value);
}
process1(1,{"str1":str1},{"o","o"});//调用传参将变得简单
process1(new Integer(12),map1,list1);
}
public String process1(Integer in,Map map,List list){
return "success";
}
}
试想一下以上代码如果用“正宗的”java做,用tiger做,会是怎样?