科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件 Java5.0,越来越死板的java

Java5.0,越来越死板的java

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

java5.0推出了,还号称tiger.我也兴奋的看到了我要的一些语言特征,觉得以后的开发将会方便许多。 然而tiger终究是tiger,让人难以亲近。我试用了下,有很多感受:

作者: goldrain 来源:CSDN 2008年5月29日

关键字: 死板 java python 软件

  • 评论
  • 分享微博
  • 分享邮件

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

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章