java5.0_java5.0,越来越死板的java

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 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做,会是怎样?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值